- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 12 von 19 ErsteErste ... 21011121314 ... LetzteLetzte
Ergebnis 111 bis 120 von 188

Thema: Asuro: Umbau der IR-Schnittstelle zur Hinderniserkennung

  1. #111
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Sorry,aber das ist auch net,die erste zeile setz ucsrb zu 0, Zeile 2 und 3 definieren pd1 als ausgang und ziehen ihn auf low potential,letzte zeile dürfte nur aussagen das man im program OCR2 auch klein schreiben kann.
    Nicht eine der Zeilen hat direkt was mit dem Timer2 zu tun.

  2. #112
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.02.2008
    Ort
    Bremen
    Alter
    45
    Beiträge
    119
    Hehe, die letzte Zeile sagt nicht aus, dass man das auch klein schreiben darf ocr2 ist eine Konstante, die direkt darüber definiert wird.

    edit: Hier noch mal der Vollständigkeit halber. Folgender Abschnitt ist in der Init() Funktion der Asuro-Lib zu finden - hier wird die grundlegende Einstellung vorgenommen:

    Code:
    /*
    00117     Timer2, zum Betrieb mit der seriellen Schnittstelle, fuer die
    00118     IR-Kommunikation auf 36 kHz eingestellt.
    00119   */
    00120 #if defined(__AVR_ATmega168__)
    00121   // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
    00122   TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1);
    00123   TCCR2B = _BV(CS20);
    00124   // interrupt on timer overflow
    00125   TIMSK2 |= _BV(TOIE2); 
    00126 #else
    00127   // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
    00128   TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
    00129   // interrupt on timer overflow
    00130   TIMSK |= _BV(TOIE2); 
    00131 #endif
    00132   // 36kHz carrier/timer
    00133   OCR2  = 0x91;
    Und so sieht die main() aus, hier kann die Pulsbreite je nach Taste geändert werden:

    Code:
    int main(void) 
    {
    
      unsigned char sw;
    
      Init();
      
      DDRD |= (1 << DDD1);	// Port D1 als Ausgang
      PORTD &= ~(1 << PD1);	// PD1 auf LOW
    
    //  InitIRDetect();
      while (1)
      {
        UCSRB = 0;
        OCR2 = 0xFE;
    
        if (PIND & (1 << PD0))
          StatusLED(GREEN);
        else
          StatusLED(RED);
    
        sw = PollSwitch();
        if (sw & 0x01)
          ocr2  = 0xFE;	//Pulsbreite 1
        if (sw & 0x02)
          ocr2  = 0xFD;	//Pulsbreite 2
        if (sw & 0x04)
          ocr2  = 0xFB;	//Pulsbreite 4
        if (sw & 0x08)
          ocr2  = 0xF7;	//Pulsbreite 8
        if (sw & 0x10)
          ocr2  = 0xEF;	//Pulsbreite 16
        if (sw & 0x20)
          ocr2  = 0x90;	//Pulsbreite 110
    
        if (sw)
        {  
          OCR2 = 0x91;
          PrintInt(sw); 
          SerPrint(" ");
          PrintInt(ocr2); 
          SerPrint("\r\n");
        }
    //   Msleep(100);
      }
      return 0;
    }
    edit2: Irgendwas stimmt mit der main() aber nicht, wenn ich das richtig sehe, haben die Tasten überhaupt keine Funktion mehr, ausser dass ein nichtssagender Wert ausgegeben wird ...
    Die Quelle kommt allerdings auch aus dem Release Candidate der Lib ...

  3. #113
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    Ja der erste schnipsel schaut gut aus,danke!
    Mal sehen ob ich das irgendwie in assembler hingefriemelt bekomm!

  4. #114
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    Oh man,ich bin hier kurz vorm Notaus in der Rübe.
    Irgendwie will Asuro net so wie ich gern will. Naja erst mal Schluss machen für heut und morgen noch mal Datenblatt durchlesen. Aber wenn es in C geht muss es doch auch in Assembler gehen.

    Grüße an alle

  5. #115
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    Also ich habs nach langem probieren immer noch net hinbekommen die PWM in Assembler zu realisieren. Bin für jeden Tipp dankbar.


    Gruß

  6. #116
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    Hi Leute.

    Nu ists geschafft. Hättet ihr ja auch verraten können das die 36kHz über nen Trick erzeugt werden. Naja,durch die Dokumentation in der Lib kommt man schließlich hinter dieses mysteriöse Geheimnis. Wenn man den Timer 2 in Assembler so initialisiert wie von Trapperjohn gezeigt spuckt die IR-Diode eine unmodulierte Frequenz von ca. 31,45kHz aus.

    Erstaunlich ist,mein Assembler Programm ist 4 Seiten lang,dasselbe in C (IRCollisionsTest aus dem Example_Ordner) dagegen ist 30 Seiten lang.

    Gott zum Gruße

  7. #117
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.02.2008
    Ort
    Bremen
    Alter
    45
    Beiträge
    119
    Zitat Zitat von Arthur S.
    Wenn man den Timer 2 in Assembler so initialisiert wie von Trapperjohn gezeigt spuckt die IR-Diode eine unmodulierte Frequenz von ca. 31,45kHz aus.
    Der Code da oben kommt doch 1:1 aus der ASURO Lib und sollte daher funktionieren ...

    Die geringere Größe deines Assemblerprogramms liegt mit ziemlicher Sicherheit daran, dass bei der C-Anwendung wesentlich mehr Funktionalität eingebunden ist. Im Allgemeinen ist der GCC mittlerweile schon so gut, dass die Unterschiede in der Codegröße minimal sind.

    Kannst ja mal versuchen, die ASURO Lib wegzulassen und exakt dein Assemblerprogramm nachbauen. Das Programm dürfte dann ähnlich klein sein.

  8. #118
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    @ Trapper

    Ich glaube du verstehst da was falsch,ich hab ja nicht behauptet das dein Codeschnipsel oben falsch ist. Musst ja bedenken,in Assembler stehen mir die Libs nicht zu Verfügung,ich musste meine eigenen Includes schreiben.
    Die Initialisierung die du zeigst ist zu 100% richtig,es fehlt halt nur der "Trick". Deshalb hat es auch Anfangs nicht funktioniert und der Timer spuckte 31,45kHz aus und damit konnte man ja auch nichts empfangen. Und in diesem Falle (also ohne den Trick) hat auch das Output Compare Register keinen Nutzen.

    Gruß

  9. #119
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.02.2008
    Ort
    Bremen
    Alter
    45
    Beiträge
    119
    Was für ein Trick ist das denn? Ich stecke ja in der Thematik überhaupt nicht drin - ich kann in den Quellen und der Doku der Lib nichts finden, dass außer dem o.g. Code gemacht wird.

  10. #120
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Ort
    zu Hause
    Beiträge
    12
    @Trapper

    Also,wenn man den Timer 2 initialisiert,legt man ja die Frequenz über den Vorteiler fest. Das ergibt dann Systemtakt durch Vorteiler = Zähltakt.
    Der Timer 2 kann aber in seiner Zählweise an sich nicht manipuliert werden.
    Er zählt also von 0 bis 255. Das ergibt dann die 31,...kHz.
    Man könnte einen Zählwert vorgeben,dann verbraucht man aber das OCR2.
    Der zu zählende Wert wäre dann die Differenz zwischen Max (255) und dem Wert in OCR2. So kann man bequem ne bestimmte Frequenz einstellen,diese ist dann aber net mehr pulsweitenmodulierbar, da OCR2 ja schon benutzt wird.
    Der Trick ist,den Timer Overflow zu nutzen. Man muss nur eine Interupt Service Routine schreiben die angesprungen wird wenn er Max (255) überschreitet. In dieser Routine addiert man einfach die Differenz zu dem Zählerstand.
    Zum Verständnis: Timer 2 zählt von 0 bis 255 -----> ergibt am OC2 pin 31,..kHz.
    Beim Wechsel von 255 zu 0 (Overflow) wird ISR angesprungen und 0x25 drauf addiert, daraus folgt der Timer zählt von 0x25 bis 0xFF.
    Differenz 218 (plus die 4Zyklen für die Sprünge etc.) ergibt dann 222.
    222 entspricht bei Vorteiler 1 einer Frequenz von 36,036 kHz.
    Und OCR2 kann nun für PWM genutzt werden.

    Also Fazit ohne ISR gehts nicht.

Seite 12 von 19 ErsteErste ... 21011121314 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests