Die UART hat doch schon einen eingebauten Rx-Interrupt.
Da brauchst Du doch keinen Umweg über den Timer zu machen...
askazo
Hi,
kann mir jemand Hilfestellung geben beim Programmieren eines RX Interrupts? Bin ich mit diesem 16-Bit Timer und seinem Input Capturing auf dem richtigen Weg?
mfg
jagdfalke
Die UART hat doch schon einen eingebauten Rx-Interrupt.
Da brauchst Du doch keinen Umweg über den Timer zu machen...
askazo
Achso, ich hab jetzt mal das "RX Complete Interrupt Enable"-Bit aus UCSRB auf 1 gesetzt. Ist doch richtig oder? Jetzt muss ich eigentlich nur noch eine Methode wie
schreiben aber was muss in die Klammer rein? Konnte keine Info darüber finden. Kann jemand helfen?Code:SIGNAL (SIG_OVERFLOW0){ }
mfg
jagdfalke
Ich habe hier auf dem Rechner WinAVR nicht installiert und kann's Dir auswendig leider nicht sagen.
Aber schau mal in die zu Deinem Controller passende io-Header, dort sind die Makros für alle Interrupt-Vektoren definiert. Dort solltest Du fündig werden.
askazo
was zum Henker ist ein "io-header" ??
Eine header-Datei ist eine, die üblicherweise auf .h endet. In diese werden z.B. Deklarationen usw. geschrieben.was zum Henker ist ein "io-header" ??
io-header ist somit die io.h, die du in deine Projekte einbindest. Da je nach AVR-Typ eine andere io-header-datei eingebunden wird(richtet sich nachg Eintrag im Makefile) musst du in die betreffende Headerdatei schauen. Beim ATMega32 wäre es die iom32.h
hi...
dafür gibt es ein AVR-libc Manual!schreiben aber was muss in die Klammer rein? Konnte keine Info darüber finden. Kann jemand helfen?
==> SIG_UART0_RECV
Auf die Frage was ein "io-header" ist...
weiß ich ehrlich gesagt auch nicht, vermutlich ist damit das Includefile <avr/io.h> gemeint.
Danke, aber warum funktioniert das hier dann nicht:
Meiner Meinung nach sollte ich bei minicom irgendeiner Taste drücken können und dann sollte der Controller "HALLO" zum PC senden. Warum tut er das nicht?Code:#define F_CPU 8000000 #define BAUD_RATE 9600 #include <avr/delay.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <avr/io.h> #include <avr/sfr_defs.h> // -- METHOD DECLARATIONS int putChar(char c); void uart_init(int tx, int rx); uint8_t uart_readChar(void); int main (void) { //GLOBAL INTERRUPT ENABLE sei(); //RX COMPLETE INTERRUPT ENABLE UCSRB |= (1<<RXCIE); //UART AN uart_init(1, 1); //PRINTF FÜR AUSGABE KONFIGURIEREN fdevopen(putChar,NULL,0); while(1) { } return 0; } SIGNAL(SIG_UART0_RECV) { printf("HALLO"); } // -- UART METHODS void uart_init(int tx, int rx) { UBRRL = (F_CPU/(BAUD_RATE*16l)-1); if(tx == 1) { UCSRB |= (1<<TXEN); } if(rx == 1) { UCSRB |= (1<<RXEN); } } int putChar(char c){ while ( !( UCSRA & (1<<UDRE)) ); UDR=c; return 0; } uint8_t uart_readChar(void) { loop_until_bit_is_set(UCSRA, RXC); return UDR; }
mfg
jagdfalke
Sorry, war vielleicht ein wenig blöd ausgedrückt. Ich meinte eben nicht die io.h, sondern die zum Prozessor passende Header-Datei, wie z.B. die iom32.h für den Mega 32. Ich weiß ja nicht, welchen µC er einsetzt...Zitat von skillii
@ jagdfalke: Ich schätze mal, dass Dein µC nur eine UART hat. Von daher müsste es nicht SIG_UART0_RECV sondern SIG_UART_RECV heißen.
askazo
Vielen Dank es geht jetzt, hab jetzt auch mittlerweile iom32.h gefunden. Dort gibt es SIG_USART_RECV und SIG_UART_RECV. Ich hab ersteres genommen (ist ja das aktuellerer oder?) und siehe da es funktioniert.
Zuerst hat er nicht mehr aufgehört "HALLE" auszugeben aber das lag wohl daran, das das Register noch voll war. Nach dem Auslesen des Datenregisters gehts.
Thx
jagdfalke
Lesezeichen