- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 10

Thema: UART Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    UART Interrupt

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Die UART hat doch schon einen eingebauten Rx-Interrupt.
    Da brauchst Du doch keinen Umweg über den Timer zu machen...

    askazo

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    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
    Code:
    SIGNAL (SIG_OVERFLOW0){
    
    }
    schreiben aber was muss in die Klammer rein? Konnte keine Info darüber finden. Kann jemand helfen?

    mfg
    jagdfalke

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    was zum Henker ist ein "io-header" ??

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2005
    Ort
    Obertraun
    Alter
    36
    Beiträge
    194
    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.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Danke, aber warum funktioniert das hier dann 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;
    }
    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

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Zitat Zitat von skillii
    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

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen