- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 34

Thema: mega8 oder tiny2313 oder tiny45 oder ... ?

  1. #21
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Anzeige

    Praxistest und DIY Projekte
    Hi Willa,

    Du weißt ja, dass ich in Bascom ein absoluter Nobody bin. Aber gerade habe ich einen tiny85 auf dem Breadbord - der im Wesentlichen von seinem Timer "lebt". Du weißt sicher, dass der tiny85 ein Bruder vom t45 ist. Läuft mit 8 MHz+CKDIV8 - also mit 1 MHz vom internen Oszillator. Daraus mache ich mit dem Timer0 einen Takt von 1 ms => 1 kHz. WENN ich den Prescaler (CLK/ 8 ) nicht nehmen würde und WENN ich die fuse CKDIV8 nicht nehmen würde - könnte ich also ohne Änderung auf einen Takt von 64 kHz kommen - 15 µs/Takt bei 8 MHz. Und hätte keinerlei interne Taktprobleme zu erwarten. Mit einem schnelleren (Quarz-)Takt ist entsprechend mehr möglich.
    Zitat Zitat von Willa
    ... nach 250 overflows ... nach 500 overflows ... warte ich nochmal 5000 overflows ab (=20ms) ...
    Dürfte also auch Deinen Ansprüchen genügen.

    Obs Dir hilft weiß ich nun nicht, aber ich habe mal Initialisierung und ISR rausgeschippselt - hier ist der code. Wünsch Dir alles Gute:
    Code:
    /* >> 
      Sicherung 03Jan10 1630   ...C2..\PCR_80\PCR_80_tmr_x31.c 
    .............
     ================================================================================ */
    // ================================================================================
    
     
    // ================================================================================
    // ===  Initialisierung fuer Timer0 tiny85 bei 1 MHz (IntOsz) =====================
     void TC0TMR_init(void)         // Init Tmr/Cntr0, ca. 1,00 kHz = 1000µs = 1ms
     {	                        // COM0A1=COM0A0=0 => OC0A disconnected
      TCCR0A  |=  (1<<WGM01);       // Timer im CTC-Mode, Top=OCRA            doc S  82
      TCCR0B  |=  (1<<CS01);        // Prescaler 1/8 / Clock = 1/8 CPU-Takt   doc S  83
      OCR0A    =  122;              // Preset/Preload 121 => ca. 1,00 ms @ 1,0Mhz
      TIMSK   |=  (1<<OCIE0A);      // Tmr/Cntr0 CompareA interrupt enabled
     }                                
    // ================================================================================
    
    
    // ================================================================================
    // ===  Nicht unterbrechbare ISR für timer0 =======================================
    // zählt hoch mit 1 kHz/1,0 ms. Zählerwert (=Zeitwert) wird für Zeitmessung benutzt
     ISR(TIM0_COMPA_vect)           // Vektor 11 (0 ... 2 !!!)                doc S  50
    {                                 
    //### Izeit_0 = Zähler für Zeithorizont hochzählen. Izthrznt wird im main definiert
    //      durch die erforderliche Interruptzahl für EINE Sekunde
    //      Durch Izhrznt kann eine Feinjustage der "BoardUhr" erreicht werden
                                      
     Izeit_0 ++;                    // Mit 1 kHz hochzählen
     if (Izeit_0 >= Izthrznt)       // Interrupt-Timer = "Zeithorizont" begrenzen auf
                                    //   Izthrznt = Zeit für EINE Sekunde
     {                              // Izeit_0 gleich oder größer als Izthrznt ==>
       Izeit_0   =  0;              //   ...Sekundenzähler zurückstellen auf Null
       // ..... Hier folgen noch weitere Zeitvariablen (sec, min, etc).
     }                                
     return;                          
    }                                 
    // ================================================================================
    
    
    // ================================================================================
    // =====  ENDE    Subroutinen  ====================================================
    // ================================================================================
    
    Anmerkung:
    
    volatile uint16_t Izthrznt;     // Der zeitliche Horizont, z.B. 1000 für 1 sec
                                    //   Möglich wäre 60 000 <=> 1 min
    volatile uint16_t Izeit_0;      // Timertakt in timer0 <=> siehe dort
    
     Izthrznt =   996;      // Zeithorizont Timer0/1MHz / 1,00 ms => ergibt EINE Sekunde
                            // Abweichung im Test: 600 sec = 599,86 sec real
                            //      bzw. 600,00 sec +/- 0,5 sec
    Ciao sagt der JoeamBerg

  2. #22
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Mit einem Interrupt alle 4 µs oder 32 Zyklen wird das in Bascom nicht so ohneweiteres gehen. Wenn der Interrupt nicht viel zu tun hat, könnte es in ASM gehen, aber auch dann ist der µC fast nur in der ISR.

    Der Tiny45 hat auch für timer0 einen Prescaler ( /8 , /64, /256, /1024), im Datenblatt unter (13.3.1).

    Edit:
    Das erweitern der Timerauflösung sollte man anders machen. Meine Idee dazu:
    Die Zeit setzt sich zusammen aus einer kurzen Zeit bis zum ersten Überlauf, und dann einer Zahl weiterer Überläufe. In der Overflow ISR wird ein Zähler runtergezählt, und wenn man 0 erreicht hat ist das Ende der Zeit erreicht.
    Die Ungenauigkeit kommt so nur durch die Interruts Latenz (im Idealfall bis 3 oder 4 Zykeln). Und man hat nur einen Interrupt alle 256 Zyklen oder ggf. noch etwas seltener mit einem Vorteiler von 2...8.

  3. #23
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Hi! Danke für eure Tipps! ich glaube 4 µs ist aber tatsächlich etwas knapp... Habe versucht die Zeit mit meiner mechanischen Eieruhr zu stoppen, und das hat nicht geklappt
    Jetzt bin ich wieder bei der Methode die ich ursprünglich machen wollte und die auch Besserwessi vorschlägt. Auf einem Mega32 mit 16MHz und dem 8bit timer hat es jetzt auch endlich geklappt. Das Oszi zeigt ein sehr sauberes Signal mit genau der Länge und der Pause die ich einstelle.
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    $crystal = 16000000
    $baud = 38400
    
    Config Pinb.1 = Output                 'servo output
    Config Pina.0 = Output                 'statusLED
    
    Config Timer0 = Timer , Prescale = 8
    On Timer0 T0isr
    
    Dim I As Byte
    Dim Pulse As Single
    Dim Pulsetemp As Single
    Dim Fullrun As Single
    Dim Lastrun As Single
    Dim Fullrunfix As Byte
    Dim Lastrunfix As Byte
    Dim Currun As Byte
    Dim Pause As Byte
    
    Enable Timer0
    Enable Interrupts
    
    Do
    Pulse = 1.5                             'in ms
    '_______________
    '1 increment des timer0 dauert 16M / 8 = 0.0005 ms (=2000 milliHz)
    '1 ms pulse benötigt daher 1*2000 increments
    '2 ms pulse benötigt 2*2000 increments
    Fullrun = Pulse * 2000
    Shift Fullrun , Right , 8
    Lastrun = Frac(fullrun)
    Shift Lastrun , Left , 8
    Lastrun = 256 - Lastrun
    Lastrunfix = Round(lastrun)
    Fullrunfix = Int(fullrun)
    '________________
    
    Waitms 333                               'nichts tun
    
    
    Loop
    
    End
    
    T0isr:
    If Pause = 0 Then
      If Currun < Fullrunfix Then
        If Portb.1 = 0 Then
          Portb.1 = 1
        End If
        Incr Currun
      End If
      If Currun = Fullrunfix Then             'wird direkt nach dem voherigen aufgerufen...
        Timer0 = Lastrunfix
        Incr Currun
      Elseif Currun > Fullrunfix Then
        Currun = 0
        Pause = 1
        Portb.1 = 0
      End If
    Else                                    'pause=1
      '20ms pause sind  ca 150 volle überläufe
      If Pause < 150 Then                   ' 75~10ms  37~5ms
        Incr Pause                          'pause +1.5ms = frequenz
      Else
        Pause = 0
      End If
    End If
    
    Return
    Um diesen Code auf meinen tiny zu übertragen muss ich eigentlich nur den Wert 2000 durch eine 1000 ersetzen. Das werde ich heute abend mal ausprobieren.
    Viele Grüße, William
    -> http://william.thielicke.org/

  4. #24
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Okay, der code funktioniert auf nem tiny45. Leider funktioniert aber der Code für den I²C Slave nicht... Dieser wurde mal für nen Mega8 geschrieben, auf nem Tiny45 bekomme ich eine Fehlermeldung beim kompilieren...:
    Code:
    $regfile = "attiny45.dat"
    $framesize = 16
    $swstack = 16
    $hwstack = 32
    $crystal = 8000000
    
    'TWI
    '====
    
    Declare Sub Twi_init_slave
    Dim Twi_control As Byte
    Dim Twi_status As Byte
    Dim Command As Byte
    Dim Einwert As Byte
    Dim Newbyte As Byte
    
    
    Enable Interrupts
    
    
    'Init
    '=====
    Command = 0
    
    Call Twi_init_slave
    
    '-------------------------------------------------------------------------------
    '***| Hauptprogramm |***********************************************************
    '-------------------------------------------------------------------------------
    Do
         Newbyte = 0
    
         'schauen ob TWINT gesetzt ist
         Twi_control = Twcr And &H80        ' Bit7 von Controlregister
         If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8      ' Status
            'wurde ein Byte geschickt?
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Command = Twdr              ' neue Daten merken
                Newbyte = 1                 ' merken das ein neues Byte da ist
            End If
            'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100               ' TWINT löschen, erzeugt ACK
         End If
    
         'wenn ein neues Byte gekommen ist verarbeiten
         If Newbyte <> 0 Then
    
           'Register zuordnen -> Befehl
          Einwert = Command
         End If
    Loop
    End
    
    '-------------------------------------------------------------------------------
    '***| TWI: Slavekonfiguration |*************************************************
    '-------------------------------------------------------------------------------
    
    Sub Twi_init_slave
        Twsr = 0                            ' status und Prescaler auf 0
        Twdr = &HFF                         ' default
        Twar = &H22                         ' Slaveadresse setzen  I2C-RX-Adr:Hex22
        Twcr = &B01000100                   ' TWI aktivieren, ACK einschalten
    End Sub
    bei dieser Zeile
    Twi_control = Twcr And &H80
    kommt die Beschwerde
    Source variable does not match target variable [__BTMPA = TWCR]
    und bei dieser
    Twi_status = Twsr And &HF8
    kommt
    Source variable does not match target variable [__BTMPA = TWSR]
    Was läuft hier falsch...? Funktioniert der I2C Code gar nicht mit nem tiny45...?
    Viele Grüße, William
    -> http://william.thielicke.org/

  5. #25
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Es ist besser bei der Pause mit dem angebrochen Zyklus anzufangen. Sonst hat man bei einem kleinen Rest Probleme mit der Laufzeit der ISR. Eine ganz kurze Verzögerung von unter etwa 40 Zyklen kann man mit der ISR nicht erreichen, so lange braucht etwa die ISR selber. Den verkürzeten teil am Anfang: dann wird ggf. der aufruf der 2 ten ISR etwas verzögert, was aber noch nicht weiter stört. Hauptsage die letzte ISR wird schnell aufgerufen.


    Der Tiny44 hat kein extra TWI interface, sondern eine USI.

  6. #26
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Der Tiny44 hat kein extra TWI interface, sondern eine USI.
    och mensch, langsam macht das kein Spaß mehr... Von einem Problem direkt zum nächsten... Habe Google befragt aber nichts brauchbares zu Bascom & I2C & Tiny45 gefunden.
    Es gibt zwar hier einen Thread der evtl. das behandelt was ich suche, aber ich verstehe nicht genug davon. Mir fehlt jetzt echt die Motivation da weiter dran zu arbeiten. Den I2C -> PWM Adapter den ich versuche zu bauen brauche ich selber überhaupt nicht. Der ist nur für die Leute gedacht die meinen Copter nachbauen und dabei Geld für teure I2C Regler sparen wollen. Vielleicht versuche ich es nochmal mit einem Mega8, evtl. bekomme ich ja dort PWM und I2C gleichzeitig hin.
    Viele Grüße, William
    -> http://william.thielicke.org/

  7. #27
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Im Wiki Bereich steht etwas zu I2C mit der USI unter BASCOM. Das Beispiel ist da zwiar für den 2313, aber da kein Unterschiede zum Tiny45 sein.

    Mit einen Mega8 oder alternativ Mega48 wäre es einfacher, denn man hat einen 16 Bit timer, und 2 Servosignale kann man da direkt über Hardware PWM erzeugen.

  8. #28
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Hi,
    ich habe es nun mit einem mega8 hinbekommen. Auf dem Steckbrett funktioniert die Schaltung und die i2c/ pwm Konvertierung. Jetzt habe ich noch eine kurze, kleine Frage...:
    Mit Lötjumpern kann ich später die Refreshrate und die I2C Adresse einstellen ohne das Programm zu verändern. Dazu werden Pins des Megas mit GND verbunden und am Anfang des Programms wird der Pin status abgefragt. Aus Layoutgründen würde ich gerne einen Pin nicht auf GND sondern auf +5V ziehen. Geht das überhaupt...? Mir scheint dass es nicht geht...
    So ist die Einstellung für die Pins die auf GND gezogen werden:
    Code:
    Config Pinc.0 = Input                   'rate_bit1
    Portc.0 = 1
    If Pinc.0 = 0 Then ...
    Für +5V dachte ich an folgendes
    Code:
    Config Pinc.1 = Input                   'rate_bit2
    Portc.1 = 0
    If Pinc.0 = 1 Then ...
    Aber das geht nicht... Hätte es aber für logisch gealten wenn es gehen würde... :-D
    Viele Grüße, William
    -> http://william.thielicke.org/

  9. #29
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Mit schalten nach GND geht, da hat man interne Pullups. Für Schalter gegen +5V geht es nicht, denn da Fehlen Pulldownwiderstände.

    Wenn es sein muß fürs Layput, ggf. einen PIN auf low setzen und als hilftweise GND Pin nutzen, wenn man genug Pins frei hat.

  10. #30
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Du hast aber auch immer schlaue Einfälle..... Funktioniert, vielen Dank!
    Viele Grüße, William
    -> http://william.thielicke.org/

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress