- LiTime Speicher und Akkus         
Ergebnis 1 bis 10 von 19

Thema: Frage zu Software Uart mit TimerOverflow Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1

    Frage zu Software Uart mit TimerOverflow Interrupt

    Hi !
    Ich versuche Krampfhaft einen Software UART zu Basteln...
    Er soll erstmal nur Empfangen können.
    Mein Ansatz ist nicht der beste, ich dachte irgendwie das müsste so funktionieren aber scheinbar habe ich einen mega falschen Ansatz....

    ich verwende 16Mhz, habe meinen Timer auf 300Hz gestellt, da ich erst mal mit 300 Baud am testen binn...
    wo ist hier der Fehler in Meinem Ansatz ?

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #include "init.h"
    #include "lcd.h"
    
    
    //SoftUART PINS
    #define RXPIN 2
    #define RXINT INT0
    #define UARTDDR DDRD
    #define UARTPIN PIND
    #define UARTPORT PORTD
    #define T0REL 152
    
    char iOut[20];
    
    unsigned char bitCnt = 0;
    unsigned char udr = 0;
    
    
    void cfgInt0(void)
    {
        MCUCR |= (1<<ISC01);        //INT0 falling edge
        GICR |= (1<<INT0);            //INT0 interrupt enable
    }
    
    void cfgTimer0(void)
    {
        TCNT0 = T0REL;
        TCCR0 |= (1<<CS02);
        //TIMSK |=(1<<TOIE0);
    }
    
    void cfgSoftUart(void)
    {
        UARTDDR &=~ (1<<RXPIN);        //RX Pin als Input
        UARTPORT &=~ (1<<RXPIN);    //RX Pin auf 0
    
        cfgInt0();                    //Software UART Interrupt
        cfgTimer0();                //Software UART Timer
    }
    
    
    int main(void)
    {
        cfgSoftUart();
        cfgLcd(LCD_ON_CURSOR_OFF);
        lcdCls();
        enableInterrupts();
    
        _delay_ms(200);
        lcdPrint("Software Uart",1,1);
    
        while(1)
    
        {    
            itoa(udr,iOut,10);
            lcdPrint("                    ",1,3);
            lcdPrint(iOut,1,3);
            itoa(udr,iOut,2);
            lcdPrint(iOut,5,3);
            
            _delay_ms(1000);
        }
          return 0;
    }
    
    
    ISR(INT0_vect)
    {
        GICR &=~ (1<<INT0);
        TCNT0 = T0REL;
        TIMSK |=(1<<TOIE0);
    }
    
    ISR(TIMER0_OVF_vect)
    {
        TCNT0 = T0REL;
    
        if (!(PIND & (1 << PD2)))
        {
            udr &=~ (1<<bitCnt++);
        }else
        {
            udr |= (1<<bitCnt++);
        }
    
        if(bitCnt == 7)
        {
            bitCnt = 0;
            TIMSK &=~(1<<TOIE0);
            GIMSK |= (1<<INT0);
        }
    }
    Mir ist auch bewusst das ich momentan das Startbit mit einlese, ich sende mir eine 85(weil binär 01010101) bekomme aber immer eine 255.

    Ich währe hier für jede Hilfe Dankbar!

    Mfg Fugitivus

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    damit man die UART 0-er u. 1-er schön oder halbwegs in der Mitte erwischt, muss man nach der Start-Bit Flanke 1 1/2 mal die Bitbreite warten.

    guckstu da:
    http://www.rn-wissen.de/index.php/So...RT_mit_avr-gcc
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    habs mit nem _delay_ms(5) inner int0 isr versucht... ich weiß das das nicht genau ist, hab auch 4 und 6 ausprobiert... das funktioniert auch nicht...

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Bei welchem AVR soll denn die gezeigte Konfiguration 300 Interrupts pro Sekunde ergeben?
    Und übrigens: hat dieser AVR kein CTC?

    habs mit nem _delay_ms(5) inner int0 isr versucht... ich weiß das das nicht genau ist, hab auch 4 und 6 ausprobiert... das funktioniert auch nicht...
    Keines dieser Delays entspricht einer halben Bitlänge. Das wäre _delay_ms(1.67). Warum überhaupt ein Delay? Warum nicht einfach dort den Timer mit einem anderen Wert vorladen?

    Und noch was: du ließt nur 7 Datenbits ein. Ist das Absicht?
    MfG
    Stefan

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.03.2010
    Beiträge
    26
    Blog-Einträge
    1
    Hi !
    Du hast recht, das ergibt 600Hz war was das probiren angeht war ich schon nen stück weiter, habe es aber irgendwie übersehen das ich den vorladewert schon verändert habe zur halben bitlänge, 5ms sind 1,5 bitlängen um das startbit zu überspringen..... 0-7 ist doch 8 ^^ oder ? ^^

    hab es ja jetzt mit 600Hz und nem flag versucht sprich bei der isr des timers wird nur jeder 2.overflow ausgewertet(was man in dieser ver des programms nicht sieht da ich irgendwie zu blöd binn in ner antwort code einzufügen) aber die idee mit 600Hz und dem flag führt immer noch zum selben Ergebniss.... Was ist denn ein CTC ?

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    5ms sind 1,5 bitlängen um das startbit zu überspringen
    Du musst ja aber nur ein halbes Bit überbrücken, denn mit dem Timer überbrückst du ja dann ein komplettes weiteres Bit. Aber wie gesagt, mit _delay_ms ist das sowieso Murks. Lass einfach den ersten Timer-Interrupt nach 1,5 Bits kommen.

    0-7 ist doch 8 ^^ oder ?
    Code:
        udr |= (1<<bitCnt++);
    }
    
    if(bitCnt == 7)
    Beim Einlesen von Bit 6 wird bitCnt auf 7 erhöht, und dann greift sofort das "bitCnt == 7", also ließt du nur 0-6.

    Was ist denn ein CTC ?
    Ein Timer-Mode, bei dem du nicht manuell den Timer vorladen musst, und damit sehr viel genauere Abstände zwischen den Interrupts hast.
    MfG
    Stefan

Ähnliche Themen

  1. Software Uart, Interrupt möglich?
    Von hunni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 07.03.2011, 17:53
  2. Frage zu Software Uart
    Von Blamaster im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 29.06.2008, 13:35
  3. Interrupt bei Software UART?
    Von coCo im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 30.11.2006, 17:22
  4. Interrupt (Oder Trick)beim Software Uart
    Von frank-wob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 09.08.2006, 11:43
  5. Ampelsteuerung, AVR AT90S8535 ,TimerOverflow Interrupt
    Von gizzi im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 18.05.2006, 19:51

Berechtigungen

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

LiTime Speicher und Akkus