- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 7 von 7

Thema: usart mit Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51

    usart mit Interrupt

    hallo leute, ich bin eine Anfängerin in Mikrocontroller, und möchte gern eine Beispiel zum Laufen bringen, aber es geht irgendwie nicht, soll man vielleicht an dem Unterprogramm avr/interrupt.h was einstellen oder mache ich das falsch.
    Bitte um Hilfe.
    danke
    hier ist meine Code
    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
    #ifndef UART_H
    #define UART_H
     
    #define F_CPU 3686400UL
     
    #define BAUD 9600UL
     
    void uart_init(void)
    {
    UCSR0B |= (1<<TXEN0) |(1<<RXEN0)|(RXCIE0<<1); // UART TX einschalten
    UCSR0C |= (1<<UMSEL01)|(1 << UCSZ01)|(1 << UCSZ00); // Asynchron 8N1
     
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;
    }
     
     
     
    ISR(USART_RX_vect)
     
    {
    uint8_t receiv;
    while (!(UCSR0A & (1<<RXC0)))
    receiv = UDR0;
    UDR0=receiv;
    PORTB = receiv;
     
    }
     
     
    int main(void)
    {
    DDRB=0xFF;
    char Line[40]; // String mit maximal 39 zeichen
     
    uint8_t c;
    uart_init();
     
    sei();
     
     
    while (1) 
    {
     
    */
    }
     
    return 0; // never reached 
    }
    #endif // UART_H

    danke
    Geändert von PicNick (23.03.2011 um 14:23 Uhr)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von .:Sebastian:.
    Registriert seit
    07.01.2006
    Ort
    Arkon I
    Beiträge
    203
    Moin

    Was genau geht nicht nicht ?
    aber es geht irgendwie nicht
    Kann ja alles heißen. (Aber meine Kristallkugel, wurde letztes Jahr konfisziert.)

    Was vllt. noch wissen sollte :
    Ein Schaltplan zu Hardware wäre nicht schlecht.
    Konkret wäre nützlich zu wissen :
    1) Wie ist der AVR mit dem PC verbunden ? (Ich vermute mal die übliche max232-Geschichte)
    2) #define F_CPU 3686400UL -> Sieht für mich aus als wolltest du einen externen Quarz verwenden. Stimmt die Frequenz ? Und läuft der AVR damit überhaupt an ?

    Was mir spotan einfällt :
    Code:
    while (!(UCSR0A & (1<<UDRE0)))
            receiv = UDR0;
            UDR0=receiv;
            PORTB = receiv;
    Sieht irgendwie seltsam aus.
    Was soll da passieren ?

    Wenn ich raten müsste würde ich sagen du meinst das :
    Code:
    while (!(UCSR0A & (1<<UDRE0)));
            receiv = UDR0;
            PORTB = receiv;
    (Man beachte das neue Semikolon)

    Gib mal ein paar mehr Infos, dann kann man dir auch helfen.

    Gruß
    Sebastian

    PS:
    http://www.rn-wissen.de/index.php/UART_mit_avr-gcc
    Geändert von .:Sebastian:. (23.03.2011 um 13:53 Uhr)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    hallo sebastian,
    ja die AVR ist mit PC über RS232 angeschlossen, und ich verwende einen externen Quarz(3686400Hz), und die Kommunikation zwischen PC und AVR läuft, was ich machen wöllte ist nur ein Test, ich habe eine Datei mit 12481248 als txt gespeichert, und über Hyperterminal rufe ich die Datei auf, und das soll erst in meinem HypTer zurückgegeben(receiv=UDR0) und dann am PORTB anzeigen. das war es.
    danke
    ein Fehler:
    while (!(UCSR0A & (1<<RXC0)))
    receiv = UDR0;
    UDR0=receiv;
    PORTB = receiv;

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    (RXCIE0<<1)

    das ist verdreht !

    while (!(UCSR0A & (1<<RXC0)))
    receiv = UDR0;
    UDR0=receiv;
    PORTB = receiv;


    ist in der tat nicht ganz verständlich.
    Code:
    ISR(USART_RX_vect)
    {
    PORTB = UDR0;
    }
    sollte reichen, wenn der interrrupt mal funktioniert






    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    das Problem der Inerrupt funktioniert nicht

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    GCC ist mit der schreibweise von
    ISR(USART_RX_vect)
    extrem heikel

    veruchs mal so wie in dem Beispiel
    http://www.rn-wissen.de/index.php/UA...rrupt-Routinen

    und nicht vergessen:
    (RXCIE0<<1)

    sollte heissen
    (1 << RXCIE0)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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

Labornetzteil AliExpress