PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Interrupt



jagdfalke
12.12.2005, 21:49
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

askazo
12.12.2005, 22:47
Die Uart hat doch schon einen eingebauten Rx-Interrupt.
Da brauchst Du doch keinen Umweg über den Timer zu machen...

askazo

jagdfalke
13.12.2005, 17:49
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


SIGNAL (SIG_OVERFLOW0){

}

schreiben aber was muss in die Klammer rein? Konnte keine Info darüber finden. Kann jemand helfen?

mfg
jagdfalke

askazo
13.12.2005, 18:39
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

jagdfalke
13.12.2005, 18:49
was zum Henker ist ein "io-header" ??

Pascal
13.12.2005, 19:28
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.
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

skillii
13.12.2005, 19:29
hi...



schreiben aber was muss in die Klammer rein? Konnte keine Info darüber finden. Kann jemand helfen?

dafür gibt es ein AVR-libc Manual! :)
==> 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.

jagdfalke
13.12.2005, 19:48
Danke, aber warum funktioniert das hier dann nicht:


#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;
}


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?

mfg
jagdfalke

askazo
13.12.2005, 20:19
Auf die Frage was ein "io-header" ist...
weiß ich ehrlich gesagt auch nicht, vermutlich ist damit das Includefile <avr/io.h> gemeint.

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...

@ 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

jagdfalke
13.12.2005, 20:44
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