- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: SainSmart Arduino UNO R3 Timer

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    8
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    danke für den Link.

    Zu dem anderen Thema und um hier keine Falschinfos aufkommen zu lassen:

    Deine Aussage bezüglich der Rechenoperation mit "hex-Zahlen" und "dezimal-Zahlen" sind definitiv falsch. Die Schreibweise einer Zahl ist, solange keine String/char* verwendet wird, völlig irrelevant. Es handlet sich bei 0xFFFF lediglich um eine andere Schreibweise für 65535 (sofern es sich um eine unsigned, also vorzeichenlosen Datentypen handelt). Aus der Schreibweise in Hexadezimal lässt sich allerdings besser ablesen, dass alle bits gesetzt sind bzw. dies der maximale Wert für 16 bit sind.

    Ein einfaches Beispiel, mit dem du das verifizieren kannst:
    Code:
    void setup()
    {
      Serial.begin(9600);
    }
    
    unsigned int n;
    
    void loop()
    {
      n = 0xFFFF - 200;
      
      Serial.println(n);
      
      n = 65535 - 200;
      
      Serial.println(n);
      
      while(1);
    }
    Die Aussgabe auf Serial:
    65335
    65335

    Leider ist dadurch aber immer noch nicht mein Problem gelöst... Hat denn keiner Erfahrung mit dem SainSmart Board?
    Muss ich den Timer vielleicht anders ansteuern oder enthält das Board einen Fehler?

    Gruß,

    SACO

    ------------------------------------------------

    EDIT: Endlich! Ich habs! Scheinbar sind in dem Code gleich zwei Fehler:

    1.) 4 | 5 = 5; ich will aber WGM12 setzen, damit ich CTC nutzen kann. Dieses bit wird durch 8 repräsentiert. Richtig wäre also 13 = 8 | 5 = 1101b oder eben 1 << WGM12 | 1 << CS12 | 1 << CS10
    2.) Der zweite Fehler ist, dass das Setzen von OCR1A nur dann funktioniert, wenn TCCR1B = 0, also der Timer aus ist. Wieso das genau so ist, weiß ich noch nicht, aber vielleicht kann jemand hier
    im Forum das erklären. Sonst werde ich mir das noch raussuchen.

    Der funktionierende Code:

    Code:
    void setup()
    {
      Serial.begin(9600);
    	
      noInterrupts();
    
      // stop the timer	
      TCCR1A = 0;
      TCCR1B = 0;
      
      OCR1A = 15624; // with 16 Mhz: about one second
      TCNT1 = 0; // reset counter  
    
      // start the timer
      TCCR1B = 13; // Mode 4, CTC on OCR1A; divide by 1024
      TIMSK1 = 2;     //Set interrupt on compare match for OCIE1A
    
      interrupts();
    }
    
    ISR(TIMER1_COMPA_vect) {
      Serial.println("X");
    }
    
    void loop()
    {
    }
    Geändert von SACO (07.05.2013 um 23:15 Uhr)

  2. #12
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Mit deiner Berichtigung hast du Recht, der Compiler kommt damit klar. Nur für den Betrachter ist es verwirrend und unübersichtlich.
    Ebenso deine Schreibweise TCCR1B= 13; oder TCCR1B= 4|5; Für dich ist das ganz klar, der Betrachter muss sich das Datenblatt suchen und die Bits auseinander klauben.
    Daher ist ein TCCR1B= (1<<CS0)|(1<<CS2)|(1<<WGM12); um ein Beispiel zu nennen, für den Betrachter wesentlich übersichtlicher und aussagekräftiger.
    Das man OCR1A nur setzen kann wenn der Timer nicht läuft, bezweifle ich sehr stark.
    Überlicherweise setzt man zuerst alle Register und startet dann den Timer mit setzen des Teilerfaktors im TCCR1B Register.
    Warum suchst du ein Datenblatt des SaintSmart, das Datenblatt des Mega328 beinhaltet doch alle Informationen die du benötigst.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    8
    Ich hatte gedacht, dass aus irgendeinem Grund hier der Timer vielleicht anders angesteuert wird. Mir ging es vor allem um den Taktgeber. Aber ehrlich gesagt, habe ich von dem Kram auch nicht viel Ahnung. Die Schreibweise mit (1<<CS0)|(1<<CS2)|(1<<WGM12) habe ich erst bei der Fehlersuche kennen gelernt. Ist natürlich für den User besser zu verstehen. TCCR1B = 4 | 5 ist übrigends eben nicht 13 sondern 5.

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    ... Das man OCR1A nur setzen kann wenn der Timer nicht läuft, bezweifle ich sehr stark ...
    GUTE Zweifel! Dieses Verfahren wäre ja auch äusserst unpraktisch. Aber SACO sollte ja wirklich den Timerabschnitt im Datenblatt lesen. (Das Arbeiten mit Mikrocontrollern ohne zutreffendem Datenblatt gehört zu den letzten großen Abenteuern unserer Tage *gg*)

    Besonderes aufmerksam diese Stelle und deren Kontext davor und danach:
    Zitat Zitat von Datenblatt ATmega48A/.../328/P ... 8271E–AVR–07/2012... 16.9.2
    ... ... However, changing the TOP to a value close to BOTTOM when the counter is running with none or a low prescaler value must be done with care since the CTC mode does not have the double buffering feature. If the new value written to OCR1A or ICR1 is lower than the current value of TCNT1, the counter will miss the compare match ... ...
    Ciao sagt der JoeamBerg

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2013
    Beiträge
    8
    Ah, ok. Danke für die Info. Sollte wohl wirklich mal den ganzen Abschnitt lesen...

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. SainSmart uno r3-atmega328
    Von Droggelbecher im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 18
    Letzter Beitrag: 04.01.2013, 12:57
  2. Arduino Uno .... [GELÖST]
    Von Jonas15 im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 27.03.2012, 22:08
  3. Arduino Uno mit BASCOM
    Von uddo im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 14.02.2012, 20:22
  4. Arduino uno ... need help
    Von Leftbehindesp im Forum Arduino -Plattform
    Antworten: 3
    Letzter Beitrag: 09.02.2012, 12:46
  5. [ERLEDIGT] [ARDUINO] 2 Motoren + Servo mit dem Arduino Uno steuern
    Von Torrentula im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 31.08.2011, 17:31

Berechtigungen

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

Labornetzteil AliExpress