- LiTime Speicher und Akkus         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Atmega48 läuft auf eigener Platine nicht wie er soll!?

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Anzeige

    Praxistest und DIY Projekte
    Du hast nur keinen Programmierstecker vorgesehen, da würde ich einen Sockel verwenden.
    Doch hab ich. Ich möchte die Platine per RS232 Programmieren können. Also mit einem Bootloader. Das hat auch alles auf dem Steckbrett funktioniert. Einen ISP möchte ich aus verschiedenen Gründen nicht. Den hat mein Kumpel -für den die Platine ist- nicht. Ausserdem ist der größer als die 3Pins für RS232.
    Diesesmal wird der Atmega gesockelt so kann ich ihn ggf. austauschen oder auf dem Steckbrett programmieren und testen.

    Ja mit dem Span könntest du recht haben. Ich denke ich werde den aktuellen Schaltplan nochmal als Layout machen und dann etwas tiefer Fräsen. Dadurch werden die abstände der Leiterbahnen größer und die gefahr eines Kurzschluss geringer. Zusätzlich werde ich vor dem Löten nochmal genau hinsehen ob nicht doch ein Span vorhanden ist.

    Ich melde mich dann wie es geklappt hat.

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Soooo

    hab die Platine jetzt nochmal neu aufgebaut. Sie läuft jetzt fast, der Rest scheint jetzt Software zu sein. Der "restliche" Fehler lag auf dem Steckbrett auch schon vor ist mir aber nicht aufgefallen.

    Mein Programm hat jetzt ganz am Anfang eine kurze Blink routine, damit ich sehe wann der µC neu startet. Ich poste erstmal den Quellcode:
    Code:
    $regfile = "m48def.dat"
    $crystal = 8000000
    
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.0 = Output
    Config Pinb.4 = Output
    
    Mg1 Alias Portb.1
    Mg2 Alias Portb.2
    Mg3 Alias Portb.3
    Mg4 Alias Portb.4
    
    Dim I As Byte
    
    For I = 0 To 2
    Portb.1 = 0
    Waitms 150
    Portb.1 = 1
    Waitms 150
    Next
    
    
    Dim Mg1flag As Byte
    Dim Mg2flag As Byte
    Dim Mg3flag As Byte
    Dim Mg4flag As Byte
    Dim Mg1time As Integer
    Dim Mg2time As Integer
    Dim Mg3time As Integer
    Dim Mg4time As Integer
    'Dim I As Byte
    Dim State As Byte
    Dim Signal As Word
    
    
    Config Timer0 = Timer , Prescale = 64
    Const Timervorgabe = 131
    On Timer0 Timer_irq
    Enable Timer0
    
    Config Timer1 = Timer , Prescale = 8
    Enable Timer1
    Timer1 = 0
    On Int1 Messen
    Enable Int1
    Config Int1 = Rising
    Enable Interrupts
    
    Mg1flag = 0
    Mg2flag = 0
    Mg3flag = 0
    Mg4flag = 0
    Mg1time = 0
    Mg2time = 0
    Mg3time = 0
    Mg4time = 0
    
    Do
    Print Signal
     If Signal < 1500 Then
       State = 0
       Mg1 = 0
       Mg2 = 0
       Mg3 = 0
       Mg4 = 0
     Else
       State = 1
     End If
    Loop
    
    End
    
    
    Messen:
    If Timer1 = 0 Then
    Start Timer1
    Disable int1
    Config Int1 = Falling
    Enable int1
    Else
    Signal = Timer1
    Stop Timer1
    Disable int1
    Config int1 = Rising
    Enable int1
    Timer1 = 0
    End If
    
    Return
    
    Timer_irq:
    Timer0 = Timervorgabe
    Disable Interrupts
    Disable Timer1
    If State = 1 Then
    If Mg1time = 0 Then
       If Mg1flag = 1 Then
          Do                                                    ' Auszeit
             I = Rnd()
          Loop Until I < 10
          Mg1time = I + 46                                      ' Auszeit
          Mg1 = 0
          Mg1flag = 0
          Print I
       Else
          Mg1time = 10                                          ' Anzeit
          Mg1 = 1
          Mg1flag = 1
       End If
    End If
    
    If Mg2time = 0 Then
       If Mg2flag = 1 Then
          Do                                                    ' Auszeit
             I = Rnd()
          Loop Until I < 10
          Mg2time = I + 91                                      ' Auszeit
          Mg2 = 0
          Mg2flag = 0
          Print I
       Else
          Mg2time = 10                                          ' Anzeit
          Mg2 = 1
          Mg2flag = 1
       End If
    End If
    
    If Mg3time = 0 Then
       If Mg3flag = 1 Then
          Do                                                    ' Auszeit
             I = Rnd()
          Loop Until I < 10
          Mg3time = I + 71                                      ' Auszeit
          Mg3 = 0
          Mg3flag = 0
          Print I
       Else
          Mg3time = 20                                          ' Anzeit
          Mg3 = 1
          Mg3flag = 1
       End If
    End If
    
    If Mg4time = 0 Then
       If Mg4flag = 1 Then
          Do                                                    ' Auszeit
             I = Rnd()
          Loop Until I < 10
          Mg4time = I + 71                                      ' Auszeit
          Mg4 = 0
          Mg4flag = 0
          Print I
       Else
          Mg4time = 10                                          ' Anzeit
          Mg4 = 1
          Mg4flag = 1
       End If
    End If
    
    
    Decr Mg1time
    Decr Mg2time
    Decr Mg3time
    Decr Mg4time
    Enable Interrupts
    Enable Timer1
    End If
    Return
    Sorry das ichs nicht kommentiert hab, da bin ich noch nicht zu gekommen.

    Nun wie ihr seht springt das Programm jede 1ms in die Interrupt routine. Je nach Empfängersignal blinken die Led´s. Mein Problem ist jetzt, das der µC wenn das Empfängersignal unter 1,5ms ist sauber durchläuft und wenn es über 1,5ms ist die Led´s nur eine kurze Zeit ca. 2sekunden blinken. Danach startet der µC neu. Wenn die Led´s nicht blinken, bleibt er an und läuft sauber weiter.

    Ich hab leider im Moment keine Idee woran das liegen kann, ausser das irgendwie ein Timer überläuft und was unvorhergesehenes passiert. Oder das die beiden Interrupts sich behindern.

    Der Watchdog ist aus. Jedenfalls wenn damit das Fuse "Watchdog timer always on" = unchecked im Burnomat gemeint ist.

    Danke
    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  3. #13
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.055
    Es gibt 2 Möglichkeiten um den Watchdog zu aktivieren. Entweder so wie du schon geschrieben hast über Fuses oder im Programm mit dem Register WDTCSR. Aber der scheint nicht aktiv zu sein, da der Reset nur bei aktiver Led ausgeführt wird.

    Bei Bascom kenne ich mich aber nicht aus, da ich mit C programmiere.

    MfG Hannes

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Ich komme nicht weiter.
    Mir fehlt ein Ansatz woran der Reset liegen könnte. Den Watchdog schliesse ich mal aus.
    Spannungsversorgung ist auch stabil genug.

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  5. #15
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Ein Problem könnte ein zu knapper Stack sein. Wenn man Interrupts nutzt braucht man da mehr Platz und wenn man gar wie hier (vermutlich unbeabsichtigt) auch noch verschachtelte Interrupts zuläßt, brauch man noch mehr Platz auf dem Stack. In der ISR (hier aber Timer_irq: ) braucht man kein "Disable Interrupts" - das macher der µC schon von sich aus. Entsprechend ist das "Enable Interrupts" dann zu viel, und gibt ungewollt einen verschachtelten Interrupt für den kurzen Rest frei.
    Geändert von Besserwessi (05.08.2011 um 18:16 Uhr) Grund: unbeabsichtiger Smily

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Hi,

    wenn du mit den verschachtelten Interrupts meine Messroutine und die Blinkroutine meinst, das ist schon so gewollt das die sich überlagern können. Weil ich so nicht erst warten muss bis er irgendwas erledigt hat. Ich kann also den momentanen Auftrag abbrechen und mit neuen bedingungen Versorgen.
    Wenn du das "enable" am ende der Routine meinst dann hast du sicher recht das ist so nicht gewollt!
    Das "disable Interrupts" und "disable timer" hab ich rausgenommen. Das "enable" dementsprechend natürlich auch.

    Ich hab mal als Stack
    Code:
    $hwstack = 50
    $swstack = 50
    $framesize = 50
    angegeben. Dann müsste ich ja noch 106 bytes für meine Variabeln über haben. Ist das so genug Stack?

    Getestet hab ichs noch nicht, da komme ich evtl. nachher noch zu.

    Danke
    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Hallo!

    Vieleicht liegts ja daran:

    Auszug aus der Hilfe
    var = RND( limit )


    Für was soll diese Random Aktion gut sein?

    MfG
    Rone

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Die RND() soll etwas variation in die Blinkerei bringen.

    Die RND-Funktion ist echt nicht das Gelbe vom Ei. Wie man sieht musste ich ja schon pfuschen um überhaupt einen Wert zwischen 0 und 10 zu bekommen:
    Code:
    Do
    I = Rnd()
    Loop Until I < 10
    weil das mit dem Limit scheinbar in Verbindung mit Interrupts nicht funktioniert. Dazu hab ich auch schon in einem anderen Thread Hilfe bekommen. Da sind wir eben auf diese Pfuschlösung gekommen.

    Danke
    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    So habs gerade getestet. Jetzt läuft er fast wie er soll. Danke nochmal an alle die mir geholfen haben!!!

    Das einzige was mir jetzt nicht gefällt, ist meine pfusch RND() Lösung. Denn manchmal dauert es sehr lange -ein paar Millisekunden- bis er eine RND-Zahl unter 10 errechnet hat. Ich glaube das sich die abfolge der RND-Zahlen nach ca. 2-3 Sekunden wiederholt.

    Gibt es da eine andere Möglichkeit ohne äußere Beschaltung?
    Ich hätte da eine Idee, weiss aber nicht ob die so praktikabel ist. Was wäre wenn ich einfach am PC eine Liste von RND-Zahlen erstelle und diese ins EEPROM schreibe. Diese könnte mein Programm ja dann einfach nacheinander lesen und den Timer passend setzen. Das sich das ganze dann Irgendwann wiederholt ist mir klar aber das ist ja mit der RND Funktion auch nicht anders. Das EEPROM kann man doch unendlich oft lesen oder?
    Wie lange dauert es ca. bei 8Mhz ein Byte zu lesen?

    Edit: Sonst könnte ich ja...
    Code:
    DIM I as Byte            'am Anfang definieren
    '-------------------------------------------
    I = RND()
    I = I/25
    ... das wäre zeitlich konstanter und schneller. Denn RND() mit limit funktioniert nicht und wenn ichs so wie im Beispiel mache, ist es eine RND-Zahl ziwschen 0 und 255.
    Was meint ihr?

    Danke
    Gruß Daniel
    Geändert von DanielSan (09.08.2011 um 18:22 Uhr)
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hallo,
    ich habe gerade die RND Funktion mit Limit ausprobiert.

    DIM I as BYTE
    I = RND(10)

    funktioniert und erzeugt Zahlen von 0 bis 9. (BASCOM Vers 2.0.5.0)

    Wenn das bei Dir in der ISR nicht geht, könntest Du in der Hauptschleife eine Zufallszahl erzeugen und in der ISR benutzen?


    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Atmega48 läuft mit 1Mhz statt 8Mhz
    Von DanielSan im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 05.03.2011, 15:10
  2. Atmega48 tut nicht so wie ich will
    Von Halodri im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 04.12.2010, 11:17
  3. Eigener C Code auf ATTiny13 funktioniert nicht
    Von chaotic im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 26.04.2008, 11:29
  4. [läuft+Code] Servotest an ATtiny13 läuft nicht
    Von oberallgeier im Forum Motoren
    Antworten: 4
    Letzter Beitrag: 18.10.2007, 17:49
  5. Antworten: 3
    Letzter Beitrag: 15.08.2005, 17:41

Berechtigungen

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

LiTime Speicher und Akkus