- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Mega 8 für Intervallauslöser

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.08.2005
    Ort
    Pegnitz
    Alter
    35
    Beiträge
    36

    Mega 8 für Intervallauslöser

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich beschäftige mich immer wieder mal mit dem Thema AVRs und deren Programmierung aber so ganz bin ich da noch nicht eingestiegen
    Nun da meine Prüfungen vorbei sind habe ich mir zwei Mega 8 besorgt und einen Kodierschalter dazu. Meine Herausforderung war es die Schaltstellung des Schalters ab zu fragen und dann einen Impuls in verschiedenen Abständen an einem Pin aus zu geben. Diesen "Intervallauslöser" brauche ich für Stop-Motion-Filme.
    Jetzt habe ich den Code im einfachsten Stil zusammengeschrieben und wollte das ganze testen aber der µC macht nur ein paar Zustandswechsel an der angeschlossenen LED und das war es dann. Würde sich da jemand mal erbarmen meinen Code anzusehen?

    Was mache ich falsch und warum dauert der Abstand zwischen den Intervallen nicht 1 Sekunde wenn ich sage Waitms 1000, was mache ich falsch ?

    Gruß Johannes

    Code:
    $regfile = "m8def.dat"                                      ' Konfiguration mit extrenem Quarz
    $crystal = 3686411
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    
    
    Config Portc.4 = Output                                                                      'Das ist der Ausgang für den IR-Auslöser  
    Config Pind.0 = Input                                                                           'Mit PinD.0 -3 Werden die Pins des Codierschalters (PT65 303) verbunden
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    
    Pind.0 = 1                                                  'Internen Pull-Up Widerstand eingeschalten
    Pind.1 = 1
    Pind.2 = 1
    Pind.3 = 1
    Do
    
    If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then       '0,5 Sekunden
    Waitms 20                                                   '20 ms um ein Prellen abzuwarten
    Portc.4 = 1
    Waitms 500
    Portc.4 = 0
    Waitms 30                                                   '30ms um dem Auslöser Zeit zu geben
    End If
    
    If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then       '1 Sekunde
    Waitms 20
    Portc.4 = 1
    Waitms 1000
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 0 Then       '2 Sekunden
    Waitms 20
    Portc.4 = 1
    Waitms 2000
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 0 Then       '4 Sekunden
    Waitms 20
    Portc.4 = 1
    Waitms 4000
    Portc.4 = 0
    Waitms 30
    End If
    
    
    If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then       '8 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 8
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then       '16 Sekunden
    Waitms 16
    Portc.4 = 1
    Wait 4
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then       '32 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 32
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then       '48 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 48
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then       '60 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 60
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then       '75 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 75
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then       '90 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 90
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then       '105 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 105
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 1 Then       '120 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 120
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then       '150 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 150
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then       '180 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 180
    Portc.4 = 0
    Waitms 30
    End If
    
    If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then       '210 Sekunden
    Waitms 20
    Portc.4 = 1
    Wait 210
    Portc.4 = 0
    Waitms 30
    End If
    
    
    
    Loop
    End

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hallo,

    um den internen Pullup einzuschalten mußt Du Portd.0 = 1 und nicht Pind.0 = 1 schreiben!


    Äquivalent natürlich auch die anderen Pins.


    Wenn "waitms 1000" keine Sekunde ist, stimmt was nicht mit dem Takt, mit dem der Mega8 läuft. Quarz? Fuses? $CRYSTAL Angabe?


    Gruß
    Searcher
    Geändert von Searcher (08.07.2011 um 16:17 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.08.2005
    Ort
    Pegnitz
    Alter
    35
    Beiträge
    36
    Hi Searcher,

    ohh wieder was dazu gelernt gut ich werde es ändern.

    An dem µC habe ich ein 3,686411Mhz Quarz dran und jeweils an jedem Pin einen 22pF Kondensator dran.

    Klicke auf die Grafik für eine größere Ansicht

Name:	Fusebits.jpg
Hits:	9
Größe:	87,0 KB
ID:	19277

    So sieht es bei mir aus wenn ich die Fuses auslese. hab schon versucht ihn auf Ext. Crystal umzustellen aber dann scheiterts mit der Verbindung.

    Gruß Johannes

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hi,
    leider kenne ich das Programm nicht, mit dem Du die Fuses ausliest. Die Angabe von HIGH und LOW nach Lesen der Fuses mit jeweils 0x00 ist sehr unplausibel und kann eigentlich nicht stimmen. Da müßtest Du vor dem Fuse schreiben nochmal überprüfen, ob das richtig ausgelesen ist und mit den default Werten aus dem Datenblatt vergleichen.

    Wenn die Fuses noch nicht verändert worden sind, sollte der Mega8 mit 1MHz laufen. $crystal auf 1000000 sollte dann auch die Sekunde bei waitms 1000 bringen.

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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.08.2005
    Ort
    Pegnitz
    Alter
    35
    Beiträge
    36
    Hi,
    das auslesen der Fuses hab ich mit AVR Studio 4 von Atmel gemacht.
    Einen Mega8 hab ich ja noch und der mySmartUSB light Progger dürfte nächste Woche auch eintreffen. Hoffentlich liegt es an meinem bisherigen http://cgi.ebay.de/USB-ISP-Programme...item5d2f6a7047 Adapter.

    Gruß Johannes

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Einen Mega8 hab ich ja noch
    Glaubst Du der Mega8 wär defekt? Wahrscheinlich nicht! Programm läßt sich doch flashen? Vielleicht ist die Programmier/Auslesegeschwindigkeit für die Fuses zu hoch/niedrig. Kenne leider den Programmer und AVR Studio nicht.

    Bis das Problem gelöst ist kannst Du ja Dein Programm nochmal überarbeiten. Die Prellunterdrückung kommt mir da recht suspekt vor

    Die if Bedingung wird ausgewertet und danach erst die Prellzeit abgewartet aber dann nicht nochmal abgefragt sondern der portc.4 geschaltet. Was ist, wenn sich durch die Prellerei nochwas geändert hat bzw die 1. Auswertung nicht richtig war?

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

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von bebop Beitrag anzeigen
    Hi,
    das auslesen der Fuses hab ich mit AVR Studio 4 von Atmel gemacht.
    Einen Mega8 hab ich ja noch und der mySmartUSB light Progger dürfte nächste Woche auch eintreffen. Hoffentlich liegt es an meinem bisherigen http://cgi.ebay.de/USB-ISP-Programmer-ATMEL-AVR-ATmega-ATTiny-/400227463239?pt=Wissenschaftliche_Geräte&hash=item 5d2f6a7047 Adapter.

    Gruß Johannes
    Das sollte eigentlich sehr gut klappen, ABER Nach Umstellung der Takt Frequenz (wenn gelungen), muss eventuell die ISP Programmier Frequenz angepasst werden oder die Verbindung mit dem Chip passt nicht mehr. Da hatte ich als es mir noch unbekannt war, lange gesucht. Eine einfache logische und verständliche Erklärung dafür schein es nicht zu geben, diese Probleme treten immer wieder hier auf. Ich habe das mittlerweile schnell im Griff, aber auch nur durch Praktisches herumwurschteln in dem ich die ISP Frequenz Einstellung vom Minimum bis zum Max Möglichen erhöhe.

    Gruß Richard

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    17.08.2005
    Ort
    Pegnitz
    Alter
    35
    Beiträge
    36
    Hi,
    jetzt hab ich's noch mal versucht das Programm zum Laufen zu bringen und jetzt funktioniert es endlich, schuld daran war der Hex Kodierschalter. Nachdem ich ihn vom Steckbrett verbannt habe lief alles wie gewünscht.
    Nächste Hürde:
    Das Programm passt nicht auf den eigentlich geplanten Attiny 13 drauf Bascom sagt beim Syntax Check das 161% gebraucht werden. Kann ich das Programm noch etwas schmälern oder soll ich mit einen Attiny 45 oder 84 mit 4k oder 8K Flash-Speicher holen?

    Gruß Johannes

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hallo Johannes,
    in den if Abfragen machst Du ja eigentlich immer das Gleiche, außer der unterschiedlichen Wartezeit zwischen Pin high und low schalten.

    Das könnte man zB so zusammenfassen:

    Code:
    Dim Portstatus As Byte
    Do
       Portstatus = pinb And &B00001111    'Portb komplett auslesen und nicht intressierende Pins auf 0 setzen
       Waitms 20
       Portb.4 = 1
       Select Case Portstatus
          Case 0 : Waitms 500
          Case 1 : Waitms 1000
          Case 2 : Waitms 2000
          Case 3 : Waitms 4000
          Case 3 : Wait 8
          .
          .
          Case 15 : Wait 210
       End Select
       Portb.4 = 0
       Waitms 30
    Loop
    Das sollte in den ATtiny13 passen.

    Platz für einen Quarz bleibt da aber wohl nicht mehr bei 4 Input und einem Output Pin?


    Gruß
    Searcher
    Geändert von Searcher (10.07.2011 um 19:44 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    17.08.2005
    Ort
    Pegnitz
    Alter
    35
    Beiträge
    36
    Hi Searcher,

    danke schon mal für die gute Betreuung aber jetzt muss ich noch mal Sau dumm fragen

    Stimmt dann die Config und so alles ? Bin mir da nicht sicher denn da tut sich nichts wenn ichs progge. Ich ziehe die Eingangspins Richtung Masse.

    Code:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    
    Ddrb = &B00001111
    
     Portb.0 = 1                                                 'Mit Pinb.0 -3 Werden die Pins des Codierschalters (PT65 303) verbunden
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 1
    
    
    
    
    Dim Portstatus As Byte
    Do
       Portstatus = Portb And &B00001111    'Portb komplett auslesen und nicht intressierende Pins auf 0 setzen
       Waitms 20
       Portb.4 = 1
       Select Case Portstatus
          Case 0 : Waitms 500
          Case 1 : Waitms 1000
          Case 2 : Waitms 2000
          Case 3 : Waitms 4000
          Case 4 : Wait 8
          Case 5 : Wait 16
          Case 6 : Wait 30
          Case 7 : Wait 45
          Case 8 : Wait 60
          Case 9 : Wait 75
          Case 10 : Wait 90
          Case 11 : Wait 105
          Case 12 : Wait 120
          Case 13 : Wait 150
          Case 14 : Wait 180
          Case 15 : Wait 210
          End Select
       Portb.4 = 0
       Waitms 30
    Loop

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. TWI zwichen mega 16 und mega 8
    Von rauf81 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 18.04.2011, 06:44
  2. Antworten: 3
    Letzter Beitrag: 03.12.2009, 19:36
  3. Controllerboard für Mega 16, Mega 32 und Mega 644
    Von Teslafan im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 4
    Letzter Beitrag: 02.05.2009, 01:01
  4. Wieviele Servos an den Mega 8 oder Mega 16 ?
    Von minium :) im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 06.10.2006, 19:03
  5. PB7 am Mega 128
    Von ceekay im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 23.07.2006, 00:07

Berechtigungen

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

LiTime Speicher und Akkus