- SF800 Solar Speicher Tutorial         
Seite 8 von 15 ErsteErste ... 678910 ... LetzteLetzte
Ergebnis 71 bis 80 von 150

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

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

    Praxistest und DIY Projekte
    Nein, ich mein

    while(forever)
    if (pinx.Rx) portx.Tx = 1; else portx.Tx = 0;

    ganz brutal.

    Und dann
    while(forever)
    if (bTxFlag & RX_M_REVEICE)
    if (pinx.Rx) portx.Tx = 1; else portx.Tx = 0;


    ( RX_M_Receive wird ja vom int0 gesetzt und im Timer nach 9 Bit gelöscht, also theoretisch genau ein Byte lang )
    --M_DATA is mal wurst
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #72
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Echo mag jetzt, wenn ma's echt so brutal macht

    while(1)
    {
    // if (PD2.Rx) PORTD4.Tx = 1; else PORTD4.Tx = 0;

    if(PIND&(1<<PD2))
    {
    PORTD |=(1<<PD4);
    }
    else
    {
    PORTD &= ~(1<<PD4);
    }
    }

    Jetzt probier ich gleich mit RX_M_RECEIVE
    (muss das nich if(bRxFlag & RX_M_RECEIVE) sein ??)

    if(bRxFlag & RX_M_RECEIVE)
    {
    if(PIND&(1<<PD2))
    {
    PORTD |=(1<<PD4);
    }
    else
    {
    PORTD &= ~(1<<PD4);
    }
    }
    }

    Geht auch... also wird sozusagen Frame eingehalten...
    Irgendwo wird zuviel Zeit verbraten ??
    Also in der INT0 - ISR hab ich Timer0 auch weggelassen

  3. #73
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ah ja.
    Jetzt machen wir INT0 wieder scharf wie vorgesehen
    d.h (fast) alles wir vorher, nur das eigentliche Pind.2 -> Byte lesen in der Timer-ISR lassen wir mal weg, das Echo bleibt in der while-schleife
    sollt ja gehen

    Next: In der echo-kopie im while setzen wir nicht nur das tx-Pin, sondern auch das bRxByte.7 (das MSB). rotieren lassen wir aber die Timer-iSR

    Und dann schicken wir in der while schleife das nun entstandene Byte auch mit der sende-routine weg
    haben wir jetzt ein echo o.k und wieder ein türk y ?

    (war das verständlich ? )
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #74
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Hm Step 1 ok. Einfach inner Timer-ISR auskommentieren. Funkioniert auch.

    Aber das mit 7. Bit setzen (bRxByte |=0x80 inner while-Schleife, versteh ich grad net so ganz.. also was es bringt...
    Jetzt ists ja so, das alles was an Bits bei PD2 ankommt gleich wieder an PORTD4 rausgschickt wird.

    EDIT: Meinst du den ganzen Receive-Block von der Timer-ISR in die while-Schleife ziehen ?

  5. #75
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    der Gedanke ist:
    Wir können die Bits in der while schleife offenbar richtig erkennen
    wir brauchen diese Bits aber im rxbyte an der RICHTIGEN Stelle.
    in der while schleife setzten wir das 7 Bit, und der Timer rotiert das Bit nach rechts, wenn baudratenmäßig das nächste dran ist.
    Das wird zwar nicht stimmen, sonst hätten wir ja kein Problem, aber vielleicht können wir durch Vergleich Bit-Kopie-Echo und timermäßiges Byte-Echo das Problem einkreisen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #76
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Receive-Block inner Timer-ISR:

    Code:
    	if (bRxFlag & RX_M_RECEIVE)		//	 receive ?
    	{
              if (bRxCount == 9)		// is this the stop-Bit (9th)
              {
                  bRxFlag &= ~RX_M_RECEIVE;   // receiving sequence done
    	      bRxFlag |= RX_M_DATA;	// signal data
    	      GICR |= 1<<INT0;  // re-enable int0 for next
    
    	    }
    	    else
                {
                  bRxByte >>= 1;	  // Shift right data
    
    /*	    if(PIND&(1<<PD2))  set bit or leave it
                {
                  bRxByte |=0x80;			
    	      bRxCount++;
    
                } */
    while-Schleife:

    Code:
      while(1)
      {
    
        if(bRxFlag & RX_M_RECEIVE)
    {
        if(PIND&(1<<PD2))
        {
          PORTD |=(1<<PD4);
          bRxByte |=0x80;			
          bRxCount++;
        }
        else
        {
          PORTD &= ~(1<<PD4);
        }
      }
        }

  7. #77
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Alles perfekt, aber das rxCount++ bleibt in der ISR

  8. #78
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Ok, Echo funktioniert immer noch einwandfrei.
    Probier jetzt die send_one_byte() aus

  9. #79
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Gut, aber was steht jetzt im bRxByte ?
    (zusätzlich in der while)

    if (bRxFlag & RX_M_DATA)
    {
    bRxFlag &= ~RX_M_DATA;
    _send (bRxByte);
    }

  10. #80
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.05.2005
    Beiträge
    101
    Wie fast erwartet...
    Bit-Kopie Echo passt mit send_byte wieder y

Seite 8 von 15 ErsteErste ... 678910 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests