- LiFePO4 Speicher Test         
Seite 7 von 15 ErsteErste ... 56789 ... LetzteLetzte
Ergebnis 61 bis 70 von 150

Thema: Timer0 Overflow Interrupt löst nicht aus (ATmega16)

  1. #61
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    Praxistest und DIY Projekte
    Hi, was mich etwas verwundert, ist, daß immer genau das Gleiche daherkommt. Bei Timingfehlern würde man zwar Mist erwarten, aber differenzierten Mist.
    Wenn du zb "blank" (0x20) schickst, ist grad mal 1 Bit gesetzt, der Rest null. da sollt' er doch mehr nuller erwischen.
    Ob 8/C oder 29/C, da gehts doch nur um Zahlen von 1-4
    Geh, nur um das dann vergessen zu können: dreh dich mal den Int0 von falling auf rising.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #62
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    bringt auch nix....
    (INT0 auf rising)

  3. #63
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Momemt, moment: bringt er genau das Gleiche ? (türkisches Ypsilon ?)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #64
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    jo... das ist eben des komische...
    seid neuestem auch ma nen Balken, mehrere y hintereinander oder Fragezeichen (wenn man auf der Taste bleibt).
    (EDIT: nja nur y's, wenn man das Senden abschält und nur auf Zeicheneingabe wartet)

    siehe Bild -->
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken teraterm_961.gif  

  5. #65
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Da gibt's nur eine Erklärung: da alle Müllzeichen offenbar > 128 sind und das Msb ja am Ende kommt, sind wir zu langsam.
    Er nimmt den Pegel NACH dem Stop-Bit als Daten und kriegt da immer Einser, außer bei autorepeat, da kommt dann halt schon das nächste Byte.
    Also irgendwie bringt der INT0 den Timer0 nicht rechtzeitig in Schwung.
    Tscha, *grübel*
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #66
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Aber dann würd ma trotzdem nicht immer die selbe "Kombination" bzw. Bitfolge bekommen (türk. y is 0x9fh, 10011111b).
    Oder versteh ich dich jetzt irgendwie falsch ?

  7. #67
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Na gemeint ist, daß er das ganze Byte eigentlich versäumt und erst dann zum Lesen kommt, wenn der Pegel nach dem Stop-Bit schon wieder oben ist.
    Wenn er irgendwas von dem Byte wirklich lesen täte, könnt's nicht immer das gleiche sein.
    Probier' mal folgendes:
    Laß den Timer0 immer enabled, tu' aber beim INT0 (falling) nur das Bit RX_M_RECEIVE setzen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #68
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Hm Timer0 ist eigentlich immer enabled ? (uart_init())
    Hab jetzt nur
    // bTxFlag &= ~TX_M_SEND; // Deactivate Transmit-Mode
    und
    // TIFR |= (1<<TOV0); // clear T/C0 overflow flag
    // TIMSK |= (1<<TOIE0); // enable T/C0 overflow interrupt
    auskommentiert

    Es wird nur das RX_M_RECEIVE gesetzt. Die y kommen immer noch...


    Code:
    #pragma vector=INT0_vect
    __interrupt void ext_int0(void)
    {
      if(!(bRxFlag & RX_M_RECEIVE))
      {
      GICR = 0;                     // Disable external interrupt
    //  bTxFlag &= ~TX_M_SEND;        // Deactivate Transmit-Mode
      TCNT0 = INT0_PRELOAD;         // Set timer reload-value (to 1.5 bit len). 29 = time delay that
    			        // have already been used in this
    			        // interrupt plus the time
    			        // that will be used by the time
    			        // delay between timer interrupt request
    			        // and the actual sampling of the first
    			        // data bit.
    
    //  TIFR |= (1<<TOV0);            // clear T/C0 overflow flag
    
    //  TIMSK |= (1<<TOIE0);          // enable T/C0 overflow interrupt
      bRxCount = 0;                 // Clear Receive Counter
      bRxFlag |= RX_M_RECEIVE;      // Activate Receive-Mode
      }
    }

  9. #69
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Morgen !
    Ich denke, wir bellen irgendwie den falschen Baum an.
    Wenn in der Timer-ISR zwar mit Baudrate, aber ansonsten willenlos der Rx-Pin abgefragt wird, kann nicht immer der gleiche Schrott rauskommen.
    Zeit, den Kopf schief zu halten, damit das Hirn in einer Ecke zusammenläuft und man besser denken kann.
    Da das Senden, so scheint's, ja funktioniert, könnten wir und auf das reine Echo beschränken, dann läuft der Schirm nicht immer voll.

    Back to the roots: kommentiere das Echo senden mal aus.

    1 In der Hauptschleife ignoriere alles, und kopiere einfach IMMER den RX -Pin in den TX-Pin (ohne timing, ohne Nix). Dann sollten wir doch ein tadelloses Echo senden können. DAS MUSS GEHEN
    2 mach das gleiche, aber nur, während RX_M_RECEIVE gesetzt ist, dadurch kontrollieren wir unser Frame
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #70
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    zu 1
    Du meinst inner Hauptschleife nur so:

    while(1)
    {
    if (bRxFlag & RX_M_DATA)
    {
    bRxFlag &= ~RX_M_DATA; // Acknowledge
    send_one_byte(bRxByte); // Echo character
    }
    }

Seite 7 von 15 ErsteErste ... 56789 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests