- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Attiny12 und Timer0 ?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.04.2008
    Ort
    Reit im Winkl
    Beiträge
    16

    Attiny12 und Timer0 ?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Tach zusammen,

    ich habe ein Problem mit der Programmierung eines Timers auf einem
    Attiny12.
    Ich will über das PPM-Signal aus der Fernsteuerung einen Ausgang schalten.
    Leider will der Timer nicht hochzählen. Ich habe den Mc minimal beschalten
    und ohne Quarz laufen. Kann das ein Problem sein?

    Code:
    $regfile = "attiny12.dat"                                   ' Controller = ATtiny12
    $crystal = 1000000                                          ' Takt 1MHz
    $noramclear                                                 ' RAM nicht initialisieren
    $tiny                                                       ' Stack nicht initialisieren
    '$hwstack = 32                                              ' Stackinitialisierung wird durch $TINY unterdrückt
    $swstack = 0                                                ' Software 0
    $framesize = 0                                              ' Framesize = 0
    
    '#################################################################################################################################
    '#
    '#  Hardware initialisieren
    '#
    '#################################################################################################################################
    
    Config Timer0 = Timer , Prescale = 1024                     'Timer0 geht gut
    
    Config Portb.0 = Output
    Config Pinb.4 = Input
    Portb.0 = 1
    
    '#################################################################################################################################
    '#
    '#  Variablen
    '#
    '#################################################################################################################################
    
    'Dim Rc As Iram Byte                                         ' Variablen als IRAM definieren
    
    '#################################################################################################################################
    '#
    '#  Hauptprogramm
    '#
    '#################################################################################################################################
    
    Do
    
    'Geberweg des Senders Minimum = 65 / Maximum = 110 / Mitte = 87
    
    If Pinb.4 = 0 Then
       Bitwait Pinb.4 , Set                                     'Auf positive Flanke warten
       Timer0 = 1                                               'Zaehler starten
       Bitwait Pinb.4 , Reset                                   'Auf negative Flanke warten
       Rc = Timer0
    Else
    End If
    
    If Rc > 70 Then Portb.0 = 0
    
    Loop

    Gruß Ronny

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Hi Ronny!

    Ich habe den Mc minimal beschalten
    und ohne Quarz laufen. Kann das ein Problem sein?
    Möglicherweise ja. Im Auslieferungszustand sind die Fusebits beim Tiny12 so gesetzt, dass er seinen Takt über einen externen Quarz generiert. Wenn das das Problem wäre, dürfte sich das Ding aber auch nicht brennen lassen, weil natürlich auch dazu irgendeine Art von Takt zwingend nötig ist.

    Bekommst Du denn das Programm in den Controller??

    Viel schlimmer ist aber, dass der Tiny12 gar kein RAM, sondern nur ein EEPROM hat. Das lässt sich ca. 100.000 mal beschreiben, und dann war´s das. Und 100.000 Zyklen sind schnell zusammen - bei ener Signalfrequenz von 50Hz (üblich bei RC-Signalen) in unter 1 Stunde...
    Ich würde mir an Deiner Stelle für diese Anwendung unbedingt einen Controller holen, der zumindestens ein paar lausige Bytes RAM-Speicher hat.



    Zu dem Code ist mir folgendes aufgefallen: Bei einer Taktfrequenz von 1MHz und einem Prescaler von 1024 zählt der Timer ziemlich genau alle 1ms eins weiter. Handelsübliche RC-Signale spielen sich in der Größenordnung von 0,8 bis 2,2 ms ab - da wird der Timer nicht weit über "2" hinauskommen.

    Nochwas kleines (nicht ganz so wichtig): Das "Else" muss an seiner Stelle nicht unbedingt sein - Du kannst einfach schreiben

    If Bedingung then
    Befehl 1
    Befehl 2
    ...
    End if

    ABER (und das ist wichtig): Hinter jedes "if" muss ein "end if" oder ein "else" kommen!

    Die Zeile

    Code:
    If Rc > 70 Then Portb.0 = 0
    kann so nichts werden!

    Entweder
    Code:
    If Rc > 70 then Portb.0 = 0 ELSE Portb.0 = 1
    Oder
    Code:
    If Rc > 70 then
      Portb.0 = 0
    End if
    Diese Variante hätte aber den Nachteil, dass Dein Portb.0 nie mehr wieder auf 1 gesetzt wird

    Ich hoffe, das sind erstmal in paar Ansätze zum Nachdenken

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Meister Sauerbruch,

    ich hab' selten in einem Forum eine Post wie Deine gesehen, die inhaltlich so voller Unsinn ist. Wie soll da jemand, der sich noch nicht so auskennt daraus lernen ?

    Im Auslieferungszustand sind die Fusebits beim Tiny12 so gesetzt, dass er seinen Takt über einen externen Quarz generiert.
    Datenblatt Tiny12:
    ...for which combination of CKSEL3..0 to use. Default value is “0010”, internal RC oscillator with long start-up time.

    Viel schlimmer ist aber, dass der Tiny12 gar kein RAM, sondern nur ein EEPROM hat. Das lässt sich ca. 100.000 mal beschreiben, und dann war´s das. Und 100.000 Zyklen sind schnell zusammen - bei ener Signalfrequenz von 50Hz (üblich bei RC-Signalen) in unter 1 Stunde...
    Ich würde mir an Deiner Stelle für diese Anwendung unbedingt einen Controller holen, der zumindestens ein paar lausige Bytes RAM-Speicher hat.
    Der TE verwendet im Code IRam, das ist ein Prozessorregister als Variable deklariert, da wird nicht das EEProm beschrieben.


    ...da wird der Timer nicht weit über "2" hinauskommen.
    Die einzig korrekte Aussage. Gratuliere.


    Die Zeile

    If Rc > 70 Then Portb.0 = 0

    kann so nichts werden!
    Aber klar wird die was, die macht genau das Gleiche wie:
    If Rc > 70 then
    Portb.0 = 0
    End if
    In Bascom ist es zulässig eine If Anweisung ohne End If zu schreiben, allerdings kann nur eine Anweisung nach Then folgen und die Anweisung muss sich in einer Zeile mit If befinden.

    @Ronny81,

    der Tiny12 läuft mit 1.200.000Hz, da nirgends ein Wait verwendet wird, ist das nicht weiter problematisch daß Dein $crystal nicht stimmt, nur zum Berechnen des Timerwertes solltest Du mit der richtigen Taktfrequenz rechnen.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    MagicWSmoke,

    was die fusebits betrifft, habe ich mich seit eh und je auf den engbedded-fusebit-calculator verlassen (http://www.engbedded.com/fusecalc/). Komisch kam mir das mit dem externen Quarz auch vor - aber es steht dort definitiv so unter "default settings". Inzwischen habe aber auch ich die Seite 25 im Datenblatt entdeckt...

    Auch wenn ich jetzt weiß was ein Iram Byte ist (*freu...) bleibt mir weiterhin unklar, weshalb Bascom (1.11.8.8. als Vollversion) bei mir jedes mal meckert, wenn ich ein "if" ohne "else" oder "end if" verwende. Und zwar in JEDER Art und Weise.

    Aber solche Rätsel können ja durchaus das Salz in der Suppe sein... ich werde dranbleiben!

    In diesem Sinne vielen Dank für Deine Zeilen!!
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken fuse_calculator.jpg  

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Sauerbruch,

    bleibt mir weiterhin unklar, weshalb Bascom (1.11.8.8. als Vollversion) bei mir jedes mal meckert,
    Also mit 1.11.8.8 kann ich nicht testen, meine älteste Version ist 1.11.9.3
    Damit und aufwärts bis 1.11.9.8 compiliert folgendes Beispiel ohne Probleme.
    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Dim A As Byte
    
    A = 50
    
    If A > 40 Then Portb.0 = 0
    
    
    End
    ... ich werde dranbleiben!
    Dann mal viel Erfolg


    Nachtrag:
    Hab' noch 'ne 1.11.8.2 gefunden, damit geht das mit If ohne End If genauso.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von MagicWSmoke
    Meister Sauerbruch,
    ich hab' selten in einem Forum eine Post wie Deine gesehen, die inhaltlich so voller Unsinn ist.
    @MagicWSmoke,
    wir sind hier in einem freundlichen Forum, wo die Art deiner Kritik absolut deplatziert ist. Hier geht es - noch - nicht so zu wie im Mikrocontroller Forum oder teilweise auch im Bascom Forum.
    Du kannst ja ruhig darauf hinweisen, dass Sauerbruch da etwas falsch verstanden hat. Aber der Ton macht immer noch die Musik und der ist einfach unpassend.

    Zitat Zitat von MagicWSmoke
    In Bascom ist es zulässig eine If Anweisung ohne End If zu schreiben, allerdings kann nur eine Anweisung nach Then folgen und die Anweisung muss sich in einer Zeile mit If befinden.
    Wie du sicherlich weisst, können dort schon mehrere Anweisungen stehen.
    Z.B. so

    If A > 40 Then Portb.0 = 0 : Portb.1 = 0: PortB.2 = 0
    wobei hier nur die erste Anweisung von der Bedingung abhängig ist.
    If A > 40 Then : Portb.0 = 0 : Portb.1 = 0: PortB.2 = 0 : End If
    mit dieser kleinen Änderung sind alle Anweisungen innerhalb des If-Blocks.

    @Sauerbruch,
    super, wie ruhig du darauf reagiert hast. So kommt man wieder zum eigentlichen Thema zurück.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    for_ro,

    wir sind hier in einem freundlichen Forum, wo die Art deiner Kritik absolut deplatziert ist.
    Das war noch nicht unfreundlich, unfreundlich hört sich anders an.

    Denkst Du nicht, daß es eine eigenartige Einstellung ist, falsche Aussagen eines Mitgliedes zu tolerieren, die Richtigstellung dazu aber zu kritisieren, auch wenn Dir die Form letzterer nicht gefällt ?

    Meine Kritik wäre sicher anders ausgefallen, hätte Sauerbruch nicht den Eindruck erweckt, er wüsste was er da schreibt. Bei ~400 Posts setze ich zumindest voraus daß nicht gezielt Fehlinformationen verbreitet werden.
    Also würde Deine Priorität im Zweifelsfall auf freundlicher, aber falscher Antwort liegen ? Sollte das wirklich der Fall sein, dann möchte ich natürlich nicht weiter beim gemütlichen Beisammensein stören.

    Wie du sicherlich weisst, können dort schon mehrere Anweisungen stehen.
    Z.B. so
    Ja, ist aber gefährlich, wenn Du das so einem Neuling zeigen würdest, könntest Du davon ausgehen, daß es falsch interpretiert wird. Wüsste ich es nicht besser, würde ich auch annehmen, daß alles was danach kommt, Teil der Bedingung ist.

    Code:
    If A > 40 Then Portb.0 = 0 : Portb.1 = 0: PortB.2 = 0
    wobei hier nur die erste Anweisung von der Bedingung abhängig ist.
    Das bringt nur Probleme mit der Lesbarkeit, würde ich auf alle Fälle vermeiden. If mit Anweisung in einer Zeile würde ich nur verwenden, wenn die Bedingung sicher funktioniert und ich den Code kürzen möchte.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Sauerbruch,

    wie bereits geschrieben, hat mich die Bestimmtheit Deiner falschen Aussagen dazu animiert meine Post so zu verfassen, wie ich's tat.

    Auch ich hab' natürlich schon Schmarrn geschrieben, bemüh' mich aber es dann nicht als sicher gegeben darzustellen, wenn ich's nicht auch sicher weis.
    Meine Post war als Kritik gegen Deine Aussagen gedacht, das war natürlich keine Kritik an Deiner Person, ich denke Du hast es auch nicht so aufgefasst.

    Ich freue mich, wenn es Dir einen Nutzen gebracht hat. Du scheinst mir ein Netter zu sein, da hätt' ich gern ein klein wenig die Schärfe raus genommen.

    Ludwig

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.04.2008
    Ort
    Reit im Winkl
    Beiträge
    16
    Hallo,

    danke erstmal für eure Tips.
    Leider bekomme ich für den Timer0 immer noch keinen Wert zurück.
    Bitwait und so fuktioniert. Es muss am Timer liegen, denn der hat immer
    den Wert 0, egal welchen Prescale benutze.

    Muss ich vielleicht noch einen Pin der MCs auf GND oder VCC legen?

    Ich habe mom nur RST mit 10kOhm auf VCC gelegt und Betriebsspannung
    angelegt.

    Code:
    $regfile = "attiny12.dat"                                   ' Controller = ATtiny12
    $crystal = 1200000                                          ' Takt 1,2MHz
    $noramclear                                                 ' RAM nicht initialisieren
    $tiny                                                       ' Stack nicht initialisieren
    '$hwstack = 32                                              ' Stackinitialisierung wird durch $TINY unterdrückt
    $swstack = 0                                                ' Software 0
    $framesize = 0                                              ' Framesize = 0
    
    '#################################################################################################################################
    '#
    '#  Hardware initialisieren
    '#
    '#################################################################################################################################
    
    Config Timer0 = Timer , Prescale = 64                       'Timer0 geht gut
    
    Config Portb.0 = Output
    Config Pinb.4 = Input
    Portb.0 = 1
    
    '#################################################################################################################################
    '#
    '#  Variablen
    '#
    '#################################################################################################################################
    
    Dim Rc As Iram Byte                                         ' Variablen als IRAM definieren
    
    '#################################################################################################################################
    '#
    '#  Hauptprogramm
    '#
    '#################################################################################################################################
    
    Do
    
    
    'Geberweg des Senders Minimum = 65 / Maximum = 110 / Mitte = 87
    
    If Pinb.4 = 0 Then
       Bitwait Pinb.4 , Set                                     'Auf positive Flanke warten
       Timer0 = 1                                               'Zaehler starten
       Bitwait Pinb.4 , Reset                                   'Auf negative Flanke warten
       Rc = Timer0
    Else
    End If
    
    If Rc > 1 Then Portb.0 = 0
    
    Loop

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Welche Bascom Version hast Du ?

    Bei den älteren Versionen musste man den Timer noch mit
    Code:
    Start Timer0
    starten, die neueren Versionen machen das automatisch beim Config.

    Ich habe mom nur RST mit 10kOhm auf VCC gelegt und Betriebsspannung angelegt.
    Das reicht, evtl. noch den obligatorischen 100nF Kondensator von VCC nach GND direkt am µC. Lass doch erstmal 'ne Led blinken, damit Du siehst, ob sonst alles passt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress