PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega 8 für Intervallauslöser



bebop
08.07.2011, 14:16
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


$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

Searcher
08.07.2011, 16:01
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

bebop
08.07.2011, 18:10
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.

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

Searcher
08.07.2011, 19:49
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

bebop
08.07.2011, 20:02
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%C3%A4te&hash=item5d2f6a7047 Adapter.

Gruß Johannes

Searcher
08.07.2011, 20:18
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

Richard
08.07.2011, 20:31
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=item5d2f6a7047 (http://cgi.ebay.de/USB-ISP-Programmer-ATMEL-AVR-ATmega-ATTiny-/400227463239?pt=Wissenschaftliche_Ger%C3%A4te&hash=item5d2f6a7047) 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

bebop
10.07.2011, 13:45
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

Searcher
10.07.2011, 19:37
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:


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

bebop
10.07.2011, 20:17
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.


$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

Searcher
10.07.2011, 20:26
Hi,
Du warst zu schnell. Ich hatte meinen Post editiert und aus

Portstatus = Portb And &B00001111
ein
Portstatus = pinb And &B00001111
gemacht.

Konnte das nicht testen und bin zunächst selbst auf die allgemeinene Verwechslung mit Port und Pin reingefallen.

PORT Register nutzen um zu schreiben
PIN Register nutzen um zu lesen


EDIT: DDRB ist falsch gesetzt. Benutz besser CONFIG PORT. ...

Gruß
Searcher

bebop
11.07.2011, 19:14
Hi Searcher,

ich habe jetzt das verkürzte Programm von dir in einen Attiny 2313 geladen und ihn mit einem Externen Quarz versehen denn der interne Oszillator war für mich zu ungenau. Der ganze Aufbau ist jetzt fertig und funktioniert bestens, im Vergleich zu einer Schaltung mit einem NE555 spare ich 70% an Energie O:).

Danke noch mal für die Unterstützung.

Gruß Johannes

Searcher
12.07.2011, 09:25
Der ganze Aufbau ist jetzt fertig und funktioniert bestens....Danke noch mal für die Unterstützung
Höt man gerne und gerne wieder. Bemühe mich dann auch mit weniger Nachbesserungen in meinen Beiträgen auszukommen;):)

Gruß
Searcher