Operácie

MMP Cvičenie 9: Rozdiel medzi revíziami

Z SensorWiki

 
(Jedna medziľahlá úprava od rovnakého používateľa nie je zobrazená.)
Riadok 1: Riadok 1:
== Vizualizácia pomocou UART ==
+
== Sériové komunikačné rozhranie (UART) ==
 +
 
 +
=== Úlohy ===
 +
 
 +
 
 +
# Nahrajte si knižnice pre prácu so sériovou linkou, preštudujte využitie knižnice <stdio.h> a demonštrujte.
 +
# Oboznámte sa s programom StampPlot a zobrazte časový priebeh teploty z termistora.
 +
# Vyhodnotením prechodového deja identifikujte veľkosť kondenzátora vo výstupnom filtri.
 +
 
  
 
Literatúra:
 
Literatúra:
Riadok 9: Riadok 17:
  
  
=== Rekapitulácia ===
+
=== USART ===
 +
 
 +
'''serial.h'''
 +
<source lang="c">
 +
/* ************************************************************************* */
 +
/*                                                                          */
 +
/* Description      : Header file for serial.c                              */
 +
/*                    Based on AppNote AVR109 - Self-programming            */
 +
/*                                                                          */
 +
/* FileName          : serial.h                                              */
 +
/* Compiler          : AVR-GCC/avr-libc(>= 1.2.5), TODO: IAR C 3.10C        */
 +
/* Revision          : 1.7                                                  */
 +
/* Date              : 30. November 2008                                    */
 +
/* Updated by        : Richard Balogh                                        */
 +
/* Target platform  : ATmega88, TODO: All AVRs with bootloader support      */
 +
/*                                                                          */
 +
/* ************************************************************************* */
 +
 
 +
        void inituart( void );
 +
        void sendchar( unsigned char );
 +
unsigned char recchar( void );
 +
</source>
 +
 
 +
'''serial.c'''
 +
<source lang="c">
 +
/* ************************************************************************* */
 +
/*                                                                          */
 +
/* Description      : UART communication routines                          */
 +
/*                    Based on AppNote AVR109 - Self-programming            */
 +
/*                                                                          */
 +
/* FileName          : serial.h                                              */
 +
/* Compiler          : AVR-GCC/avr-libc(>= 1.2.5), TODO: IAR C 3.10C        */
 +
/* Revision          : 1.7                                                  */
 +
/* Date              : 30. November 2008                                    */
 +
/* Updated by        : Richard Balogh                                        */
 +
/* Target platform  : ATmega88, TODO: All AVRs with bootloader support      */
 +
/*                                                                          */
 +
/* ************************************************************************* */
 +
 
 +
#include <avr\io.h>
 +
 
 +
/* baud rate register value calculation */
 +
#define CPU_FREQ 18432000UL      // If CKDIV8 checked, then /8!
 +
#define BAUD_RATE 9600
 +
                            // BAUD = f / 16 * (UBR+1) alebo UBR = CPUFREQ/16/BAUD_RATE-1
 +
#define BRREG_VALUE 119  // hodnota z tabulky v datashhete pre 18,4320MHz, 2x=0, 9600Baud, error = 0%   
 +
 
 +
 
 +
/* definitions for UART control */      // upravene pre ATmega88
 +
#define BAUD_RATE_LOW_REG UBRR0L  // ??? (Staci Low Byte, < 255 )
 +
#define UART_CONTROL_REG_B UCSR0B  // OK, checked
 +
#define ENABLE_TRANSMITTER_BIT TXEN0  // OK, checked
 +
#define ENABLE_RECEIVER_BIT RXEN0  // OK, checked
 +
#define UART_STATUS_REG UCSR0A  // OK, checked (but also control reg.)
 +
#define DATA_REGISTER_EMPTY_BIT UDRE0  // Added, for possible speed-up
 +
#define TRANSMIT_COMPLETE_BIT TXC0    // OK, checked
 +
#define RECEIVE_COMPLETE_BIT RXC0    // OK, checked
 +
#define UART_CONTROL_REG_C      UCSR0C  // Added for mode setting
 +
#define UART_DATA_REG UDR0    // OK, checked
 +
 
 +
 
 +
 
 +
void inituart(void)
 +
{
 +
  BAUD_RATE_LOW_REG = BRREG_VALUE;                // OK, preddelic pre 9600
 +
                                                  // bit 2x = 0
 +
  UART_CONTROL_REG_C = (1<<UCSZ01)|(1<<UCSZ00);    // Added: Async. UART, None
 +
                                                  // Parity, 8-data, 1 stopbit
 +
  UART_CONTROL_REG_B = (1 << ENABLE_RECEIVER_BIT)|
 +
                    (1 << ENABLE_TRANSMITTER_BIT); // enable receive + transmit
 +
                                                 
 +
}
 +
 
 +
 
 +
void sendchar(unsigned char c)
 +
{
 +
  UART_DATA_REG = c;                                  // prepare transmission
 +
  while (!(UART_STATUS_REG & (1 << TRANSMIT_COMPLETE_BIT)));// wait until byte sendt
 +
  UART_STATUS_REG |= (1 << TRANSMIT_COMPLETE_BIT);          // delete TXCflag
 +
}
 +
 
 +
 
 +
unsigned char recchar(void)
 +
{
 +
  while( !(UART_STATUS_REG & (1 << RECEIVE_COMPLETE_BIT)) );  // wait for data
 +
  return UART_DATA_REG;
 +
}
 +
</source>
 +
 
 +
Testovací program. Testujeme len posielanie, naše káble nemajú privedené RxD.
 +
 
 +
'''main.c'''
 +
<source lang="c">
 +
#include <avr\io.h>
 +
#include "serial.h"              // Nasa kniznica...
 +
 
 +
int main(void)
 +
{
 +
char c;
 +
 
 +
  DDRD = 0b00000010;
 +
PORTD = 0b00000011;    // Set TxD pin as an output, RxD input
 +
 +
inituart();
 +
sendchar('O');
 +
sendchar('K');
 +
sendchar('\n');
 +
 
 +
for (c=32;c<=127;c++)
 +
  sendchar(c);
 +
 
 +
for (;;) {
 +
    /* Do nothing */
 +
          }
 +
}
 +
</source>
 +
 
 +
 
 +
 
 +
== <TT>printf()</TT> na jednočipe? ==
 +
 
 +
Ak si napíšete vlastnú funkciu na zobrazenie jedného znaku na displej, alebo pre vyslanie
 +
jedného znaku po sériovej linke, potom môžete používať naozaj aj funkciu printf so všetkými jej vymoženosťami.  Využívame pre tom knižnicu <TT>stdio.h</TT>, ktorá sa používa takto:
 +
<source lang="c">
 +
...
 +
#include <stdio.h>
 +
 
 +
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
 +
                              // 'sendchar' je nova funkcia pre jeden znak
  
Máte k dispozícii vývojovú dosku '''MiniMEXLE''' ([http://virtuallab.kar.elf.stuba.sk/robowiki/index.php?title=Mexle popis],[[Médiá:MiniMexleSchematic.jpg|schéma zapojenia]]) a s procesorom ATmega88 ([http://ap.urpi.fei.stuba.sk/mmp/ATmega88.pdf datasheet]) a prípadne aj testovací program [[Médiá:MexleTest2.hex|mexletest2.hex]].
+
int main(void)
 +
{
 +
inituart();               // Inicializacia seriovej linky
 +
stdout = &mystdout;          // Odteraz funguje printf();
  
V tejto úlohe sa predpokladá znalosť funkcie A/D prevodníka z prednášky (datasheet, str. 87 -- 115).  
+
printf("Hello, world!");
Procesor je nakonfigurovaný na prácu s externým kryštálovým oscilátorom 18,432 MHz (fuses).
+
return 0;
Demonštračný program je tuto: [[Médiá:MexleTest2.hex|mexletest2.hex]]
+
}
 +
</source>
 +
Takto potom môžete používať naozaj aj funkciu printf() so všetkými jej vymoženosťami...
 +
Úplne rovnako sa dá implementovať printf() aj na LCD displej, len ho treba na začiatku zinicializovať a namiesto funkcie sendchar napísať niečo ako LCDsendchar().
  
  
=== USART ===
+
[[MMP Cvičenie 9|Návrat na cvičenie 9...]]
 +
 
 +
[[Category: AVR]][[Category: MMP]]
  
  
Riadok 52: Riadok 196:
 
Manual: [[Stamp Plot Manual]]
 
Manual: [[Stamp Plot Manual]]
  
 
 
=== Úlohy ===
 
 
 
# Nahrajte si knižnice pre prácu so sériovou linkou, preštudujte využitie knižnice <stdio.h> a demonštrujte.
 
# Doplňte program o jednoduchý A/D prevod a zobrazte hodnotu z termistora na doske MiniMEXLE.
 
# Overte prevod A-D prevodníka meraním vnútornej referencie 1,1 V
 
# Upravte program pre A-D prevod tak, aby v pracoval autonómne s periódou vzorkovania 100ms.
 
# Oboznámte sa s programom StampPlot a zobrazte časový priebeh teploty z termistora.
 
# Vyhodnotením prechodového deja identifikujte veľkosť kondenzátora vo výstupnom filtri.
 
  
  

Aktuálna revízia z 09:50, 12. november 2010

Sériové komunikačné rozhranie (UART)

Úlohy

  1. Nahrajte si knižnice pre prácu so sériovou linkou, preštudujte využitie knižnice <stdio.h> a demonštrujte.
  2. Oboznámte sa s programom StampPlot a zobrazte časový priebeh teploty z termistora.
  3. Vyhodnotením prechodového deja identifikujte veľkosť kondenzátora vo výstupnom filtri.


Literatúra:


USART

serial.h

/* ************************************************************************* */
/*                                                                           */
/* Description       : Header file for serial.c                              */
/*                     Based on AppNote AVR109 - Self-programming            */
/*                                                                           */
/* FileName          : serial.h                                              */
/* Compiler          : AVR-GCC/avr-libc(>= 1.2.5), TODO: IAR C 3.10C         */
/* Revision          : 1.7                                                   */
/* Date              : 30. November 2008                                     */
/* Updated by        : Richard Balogh                                        */
/* Target platform   : ATmega88, TODO: All AVRs with bootloader support      */
/*                                                                           */
/* ************************************************************************* */

         void inituart( void );
         void sendchar( unsigned char );
unsigned char recchar( void );

serial.c

/* ************************************************************************* */
/*                                                                           */
/* Description       : UART communication routines                           */
/*                     Based on AppNote AVR109 - Self-programming            */
/*                                                                           */
/* FileName          : serial.h                                              */
/* Compiler          : AVR-GCC/avr-libc(>= 1.2.5), TODO: IAR C 3.10C         */
/* Revision          : 1.7                                                   */
/* Date              : 30. November 2008                                     */
/* Updated by        : Richard Balogh                                        */
/* Target platform   : ATmega88, TODO: All AVRs with bootloader support      */
/*                                                                           */
/* ************************************************************************* */

#include <avr\io.h>

/* baud rate register value calculation */
#define	CPU_FREQ	18432000UL      // If CKDIV8 checked, then /8!
#define	BAUD_RATE	9600
                             // BAUD = f / 16 * (UBR+1) alebo UBR = CPUFREQ/16/BAUD_RATE-1
#define	BRREG_VALUE	119  // hodnota z tabulky v datashhete pre 18,4320MHz, 2x=0, 9600Baud, error = 0%    


/* definitions for UART control */      // upravene pre ATmega88
#define	BAUD_RATE_LOW_REG	UBRR0L  // ??? (Staci Low Byte, < 255 )
#define	UART_CONTROL_REG_B	UCSR0B  // OK, checked
#define	ENABLE_TRANSMITTER_BIT	TXEN0   // OK, checked
#define	ENABLE_RECEIVER_BIT	RXEN0   // OK, checked
#define	UART_STATUS_REG		UCSR0A  // OK, checked (but also control reg.)
#define DATA_REGISTER_EMPTY_BIT UDRE0   // Added, for possible speed-up
#define	TRANSMIT_COMPLETE_BIT	TXC0    // OK, checked
#define	RECEIVE_COMPLETE_BIT	RXC0    // OK, checked
#define UART_CONTROL_REG_C      UCSR0C  // Added for mode setting
#define	UART_DATA_REG		UDR0    // OK, checked



void inituart(void)
{
  BAUD_RATE_LOW_REG = BRREG_VALUE;                 // OK, preddelic pre 9600
                                                   // bit 2x = 0
  UART_CONTROL_REG_C = (1<<UCSZ01)|(1<<UCSZ00);    // Added: Async. UART, None 
                                                   // Parity, 8-data, 1 stopbit
  UART_CONTROL_REG_B = (1 << ENABLE_RECEIVER_BIT)|
                    (1 << ENABLE_TRANSMITTER_BIT); // enable receive + transmit 
                                                   
}


void sendchar(unsigned char c)
{
  UART_DATA_REG = c;                                   // prepare transmission
  while (!(UART_STATUS_REG & (1 << TRANSMIT_COMPLETE_BIT)));// wait until byte sendt
  UART_STATUS_REG |= (1 << TRANSMIT_COMPLETE_BIT);          // delete TXCflag
}


unsigned char recchar(void)
{
  while( !(UART_STATUS_REG & (1 << RECEIVE_COMPLETE_BIT)) );  // wait for data
  return UART_DATA_REG;
}

Testovací program. Testujeme len posielanie, naše káble nemajú privedené RxD.

main.c

#include <avr\io.h>
#include "serial.h"              // Nasa kniznica... 

int main(void) 
{
 char c;

  DDRD = 0b00000010;
 PORTD = 0b00000011;    // Set TxD pin as an output, RxD input
 
 inituart();
 sendchar('O');
 sendchar('K');
 sendchar('\n');

 for (c=32;c<=127;c++) 
   sendchar(c);

 for (;;) {
     /* Do nothing */
          }
}


printf() na jednočipe?

Ak si napíšete vlastnú funkciu na zobrazenie jedného znaku na displej, alebo pre vyslanie jedného znaku po sériovej linke, potom môžete používať naozaj aj funkciu printf so všetkými jej vymoženosťami. Využívame pre tom knižnicu stdio.h, ktorá sa používa takto:

...
#include <stdio.h>

FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
                              // 'sendchar' je nova funkcia pre jeden znak

int main(void)
{ 
 inituart();	               // Inicializacia seriovej linky
 stdout = &mystdout;           // Odteraz funguje printf();

 printf("Hello, world!");
 return 0;
}

Takto potom môžete používať naozaj aj funkciu printf() so všetkými jej vymoženosťami... Úplne rovnako sa dá implementovať printf() aj na LCD displej, len ho treba na začiatku zinicializovať a namiesto funkcie sendchar napísať niečo ako LCDsendchar().


Návrat na cvičenie 9...


Nebudeme sa zaoberať detailmi implementácie sériového komunikačného rozhrania procesorov AVR, pre naše účely postačí jednoduchá knižnica, ktorá obsahuje základné funkcie odladené pre dosku MiniMEXLE s procesorom ATmega88 a oscilátorom 18,432 MHz. Máte k dispozícii jednoduchú knižnicu pre prácu so sériovou linkou na procesore ATmega88, stiahnite a pozrite si príklady...

Parametre prenosu pre túto knižnicu sú 9600,n,8,1.

Na prácu so sériovou linkou na vašom PC odporúčame program Terminal by Bray, ale môžete to skúsiť aj s Hyperterminálom.

Keby niekoho zaujímalo, ako je realizovaný prevod TTL úrovní na RS-232, tak tu je schéma zapojenia, ktorá vychádza z tohoto návodu.

Vizualizácia

Vizualizáciu dát môžeme robiť rozlične. Jeden z možných spôsobov je vypisovať po sériovej linke v pravidelných intervaloch holé data a tie potom uložiť ako maticu do Matlabu a tam nakresliť graf, priebeh, čo treba...

Iná možnosť je použiť napr. program StampPlot, ktorý kreslí prichádzajúce data priamo ako graf, s výnimkou reťazcov, ktoré začínajú znakom '!', tie považuje za konfiguračné príkazy.

Download: StampPlotLite1.7

Príklad: AVR StampPlotExample.c Manual: Stamp Plot Manual



Download

Icon Terminal.png Terminal 1.9b

Icon StampPlotLite.png StampPlot Lite 1.7



Návrat na zoznam cvičení...