#include <avr/interrupt.h>
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
Makrodefinitionen | |
#define | F_CPU 16000000 |
#define | UART_BAUD 19200UL |
#define | UART_UBRR_BAUD ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1) |
#define | UART_BAUD_REAL (F_CPU/(16*(UART_UBRR_BAUD+1))) |
#define | UART_BAUD_ERROR ((UART_BAUD_REAL*1000)/UART_BAUD) |
#define | UART_ISR 1 |
#define | UART_TIMEOUT_ON 1 |
#define | UART_TIMEOUT_ISR 1 |
#define | UART_TIMEOUT_BOUND 100 |
#define | UART_MAXSTRLEN 380 |
Funktionen | |
void | uart_init (void) |
int | uart_receive (FILE *dummy) |
uint8_t | uart_gets (char *buffer, uint8_t maxlen) |
int | uart_sendc (char c, FILE *dummy) |
void | uart_sends (char *s) |
void | uart_clear (void) |
Variablen | |
volatile uint8_t | uart_timeout |
volatile char | uart_string [UART_MAXSTRLEN+1] |
volatile uint8_t | uart_str_complete |
volatile uint8_t | uart_str_count |
#define F_CPU 16000000 |
definiert Mikrocontroller-Taktfrequenz falls diese nicht im Makefile definiert wurde
#define UART_BAUD 19200UL |
definiert Baudrate für serielle Schnittstelle
#define UART_UBRR_BAUD ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1) |
Berechnet anhand der Taktfrequnz des Mikrocontrollers und der gewählten Baudrate die Einstellung für das Baudratenregister.
#define UART_BAUD_REAL (F_CPU/(16*(UART_UBRR_BAUD+1))) |
Berechnet die reale Bausrate zur Berechnung des Fehlers.
#define UART_BAUD_ERROR ((UART_BAUD_REAL*1000)/UART_BAUD) |
Berechnet den Fehler bei der Baudrateneinstellung
#define UART_ISR 1 |
UART_ISR Gibt an, ob ein Interrupt beim Empfangen von Zeichen ausgelöst werden soll (Globales Interrupt Flag wird nicht gesetzt).
UART_ISR=0 --> Rx Interrupt deaktiviert
UART_ISR=1 --> Rx Interrupt aktiviert
#define UART_TIMEOUT_ON 1 |
gibt an, ob mit einem Timeout gearbeitet werden soll (=1 ja, =0 nein)
#define UART_TIMEOUT_ISR 1 |
gibt an, ob mit bei dem Timeout mit einer Timer Interruptroutine gearbeitet werden soll (=1 ja, =0 nein)
#define UART_TIMEOUT_BOUND 100 |
dient als Vergleichswert zur Variablen UART_TIMEOUT_BOUND für das Arbeiten mit einem Timeout
Dies sollte abhängig von der jeweiligen Timer-Interruptroutine eingestellt werden und so bemessen sein, dass ca 200ms bis zum auslösen eines Timeout verstreichen.
(Zeit=100ms=UART_TIMEOUT_BOUND*'Zeit bis zum auslösen der Timer-Interruptroutine'; Bsp. ist Timer-Interruptroutine auf 2ms eingestellt, so sollte 'uart_timeout_bound' 100 sein).
Ist UART_TIMEOUT_ISR = 0, so wird nicht mit einer Interuptroutine gearbeitet und UART_TIMEOUT_BOUND gibt direkt die Zeit in Millisekunden an (zwischen 1..254).
#define UART_MAXSTRLEN 380 |
Definiert die maximale Anzahl von Zeichen, welche über die Rx-Interruptroutine empfangen werden können.
Dient damit auch zum Festlegen der Größe der globalen Variable /ref uart_string.
void uart_init | ( | void | ) |
Initialisiert die UART Schnittstelle des Mikrocontrollers mit gewählter Baudrate (Asynchrone 8N1).
int uart_receive | ( | FILE * | dummy | ) |
Wartet bis ein Zeichen verfügbar ist und gibt dieses zurück
dummy | wir lediglich benötigt, um die Ausgabe Standard Ein-/Ausgabe umzuleiten (kann NULL gesetzt werden) |
uint8_t uart_gets | ( | char * | buffer, | |
uint8_t | maxlen | |||
) |
Liest ankommende Zeichen in buffer bis maxlen bzw. newline
buffer | für Zeichenkette | |
maxlen | maximale Anzahl der empfangenen Zeichen (Länge der Zeichenkette) |
int uart_sendc | ( | char | c, | |
FILE * | dummy | |||
) |
Sendet ein Zeichen
c | Zeichen welches gesendet werden soll. | |
dummy | wir lediglich benötigt, um die Ausgabe Standard Ein-/Ausgabe umzuleiten (kann NULL gesetzt werden) |
void uart_sends | ( | char * | s | ) |
Sendet eine Zeichenkette
s | Pointer auf Zeichenkette |
void uart_clear | ( | void | ) |
Löscht das Emfangsregister der seriellen Schnittstelle
volatile uint8_t uart_timeout |
globale Variable zum Zählen der Timer-Interrupts
volatile char uart_string[UART_MAXSTRLEN+1] |
Definiert globale Zeichenkette, welche empfangene Zeichen der Rx-Interruptroutine beinhaltet.
Die Größe der Zeichenkette wird durch maxsrtlen+1 festgelegt (maxstrlen+1 --> maxstrlen Zeichen + 'Stringende-Zeichen').
volatile uint8_t uart_str_complete |
Das Flag signalisiert der Hauptanwendung, dass eine komplette Zeichenkette in der Rx-Interruptroutine empfangen wurde und verarbeitet werden kann.
Eine komplette Zeichenkette wird durch das Erreichen von 'maxstrlen' oder dem empfangenen Zeichen für 'lf' signalisiert.
Um neue Zeichenketten zu empfangen, muss das Flag wieder rückgesetzt werden (=0).
str_complete=1 --> Zeichenkette komplett
str_complete=0 --> Zeichenkette nicht komplett (warten bis maxstrlen-Zeichen oder 'lf')
volatile uint8_t uart_str_count |
zählt die Anzahl der empfangenen Zeichen.