Forum: Mikrocontroller und Digitale Elektronik Wie AtMega8 mit Bascom programmieren


von Stefan M. (likevista)


Lesenswert?

Ich bin auch langsam am verzweifeln! Bin absoluter Anfänger!!

Ich muss für jemanden etwas bauen. Dies besteht aus 9 LED, die mit einem 
Taster jeweils wagrecht oder Diagonal leuchten sollen. Und wenn kein 
Taster gedrückt, sollen alle Blinklen.

Bin jetzt so weit, dass ich die LED über den Atmega8 einschalten kann. 
Weder Blinklich noch Taster funktionieren.

Das Flashen des Atmega8 klappt, nur ich weiß nicht wie ich das 
Programmieren soll.

Kann mir jemand Helfen?

Mit freundlichen Grüßen
Stefan

von Dominique G. (dgoersch)


Lesenswert?

Blinken über Interrupt und Timer realisieren, Abfrage der Taster mittels 
DEBOUNCE...

von Stefan M. (likevista)


Lesenswert?

Kannst du mir ein Beispiel geben wie ich das programmieren soll?

von Dominique G. (dgoersch)


Lesenswert?

Wird aber etwas später. Essen, Kind ins Bett, ...

von Stefan Meyer sein Kumpel (Gast)


Lesenswert?

Dom. mach aber hin die Hausaufagbe muss morgen fertig sein !!!

von Stefan M. (likevista)


Lesenswert?

Ich will das möglichst noch heute zumindest anfangen.

von Der Papa (Gast)


Lesenswert?

Aha, der "jemand" ist ein Lehrer - und - wie bei meinen Herren Söhnen 
auch so oft - wird die Hausaufgabe mal wieder "in letzter Minute" 
begonnen.

So eine Aufgabe erfordert aber schon ein wenig "Einarbeitung" - bis 
morgen wird das sicher nix mehr...

von Stefan M. (likevista)


Lesenswert?

Hab meine Hausaufgaben längst gemacht.

von Dominique G. (dgoersch)


Lesenswert?

Stefan Meyer wrote:
> Ich will [...].

Meinem Sohn (5) hab ich "ich möchte" beigebracht... aber nungut. Wie 
darf ich mir "diagonal oder horizontal leuchten" vorstellen? Wie sind 
die LEDs angeordnet? Zeichnung?

Gruß
Dominique Görsch

von Dominique G. (dgoersch)


Lesenswert?

Hier schonmal aus meiner Snippetsammlung was, womit ich blinke... 
aktuell für 5 LEDs A0-A4 vorgesehen, muss man für 9 dann noch ein bissl 
aufbohren, aber das schaffste sicher selber. Für mehr Hilfe brauch ich 
mehr Infos.
1
Config Timer0 = Timer , Prescale = 1024
2
3
On Timer0 Timer0_isr
4
5
Enable Timer0
6
Enable Interrupts
7
8
Dim Intervall As Integer , Blink_on As Integer
9
Dim Led As Integer , Pin As Integer
10
11
Const False = 0
12
Const True = 1
13
14
Main:
15
Do
16
   If Blink_on = True And Intervall >= 3 Then
17
      Blink_on = False
18
      Intervall = 0
19
   Elseif Blink_on = False And Intervall >= 15 Then
20
      Blink_on = True
21
      Intervall = 0
22
   End If
23
24
   For Led = 1 To 5
25
      Pin = Led - 1
26
      If Ledstate(led) = 2 Then
27
         Porta.pin = Blink_on
28
      End If
29
   Next Led
30
Loop
31
32
33
Timer0_isr:
34
   Intervall = Intervall + 1
35
Return
36
37
End

von Stefan M. (likevista)


Lesenswert?

Die LED werden wie ein Quadrat angeordnet also 3Led's in der 1. reihe, 
3LED's in der 2. Reihe, 3LED's in der 3 Reihe.

Diagonal = von links bis rechts oben.

von Dominique G. (dgoersch)


Lesenswert?

Siehe oben, da haste schonmal ne ganze Menge... das Debounce muss halt 
noch in die Main-Loop. Debounce ist in der BASCOM-Hilfe ganz gut 
erklärt. Konkrete Fragen beantworte ich aber auch gern.

von Stefan M. (likevista)


Lesenswert?

Der Meldet irgent wie so 3 errors. Aber so richtig blicke ich das noch 
nicht!

von Dominique G. (dgoersch)


Lesenswert?

Stefan Meyer wrote:
> Der Meldet irgent wie so 3 errors.
Etwas präziser wäre nicht schlecht.

> Aber so richtig blicke ich das noch nicht!
Was genau?

Gruß
Dominique Görsch

von YS-500 (Gast)


Lesenswert?

Und was hat der Lehrer zu der nicht Lösung gesagt?
Oder hast Du heute krank gemacht?

von Stefan M. (likevista)


Lesenswert?

1. ist das nicht für die Schule - sondern privat gebrauch!!!
2. Kann ich das ganze auch so machen:

$regfile = "m8def.dat"
$crystal = 1000000

Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output

Do
Portd. 2 = 1
Waitms 100
Portd. 2 = 0
Waitms 100

Portd. 3 = 1
Waitms 100
Portd. 3 = 0
Waitms 100

Portd. 4 = 1
Waitms 100
Portd. 4 = 0
Waitms 100

Portd. 5 = 1
Waitms 100
Portd. 5 = 0
Waitms 100

Portd. 6 = 1
Waitms 100
Portd. 6 = 0
Waitms 100

Portd. 7 = 1
Waitms 100
Portd. 7 = 0
Waitms 100

Portb. 0 = 1
Waitms 100
Portb. 0 = 0
Waitms 100

Portb. 1 = 1
Waitms 100
Portb. 1 = 0
Waitms 100

Portb. 2 = 1
Waitms 100
Portb. 2 = 0
Waitms 100
Loop

Und halt noch "irgendwie" die Taster danach setzten? Möglichst einfach, 
mit möglichst wenigen schritten.

Die Geschwindigkeit gefällt mir so, nur das ,was  Dominique Görsch 
gepostet hat weis ich nicht, wie ich die Led's den Port bestimme, bzw 
wie ich es erweitern oder bearbeiten kann.

Mit freundlichen Grüßen
Stefan

von YS-500 (Gast)


Lesenswert?

Poste doch mal das ganze Bascom File damit mann etwas sieht.

von Stefan M. (likevista)


Lesenswert?

Wie ganzes Bascom File?

Was ich gerade gepostet habe, ist dass was ich mir gestern "angeeignet" 
habe. Also, dass weiß ich wie es funktioniert.

von YS-500 (Gast)


Lesenswert?

Mehr wie das oben hast Du noch nicht als Code?

von Stefan M. (likevista)


Lesenswert?

Richtig, deswegen such ich ja ne Lösung, mit der ich dann noch die 
Taster einbinden kann. Suche schon 2 Stunden im Internet nach 
möglichkeiten.

Möchte ja so was wie Programmteile mache - weiß aber nicht wie das geht.

Unter Programmteile meine ich, dass wenn ich z.b. Taster 1 Drücke eine 
bestimmte Aktion ausgeführt wird, die wenn ich dann los lasse, wie 
aufhört und das Blinken wieder anfängt.

von Klaus R. (klaus2)


Lesenswert?

"state machine", Herr Lehrer!

Klaus.

von YS-500 (Gast)


Lesenswert?

if taster1 == 0 then gosub test1



test1

   mach irgend was

return

so in etwa?

von Dominique G. (dgoersch)


Lesenswert?

Aha, du willst dass die LEDs der Reihe nach blinken, dann schreib das 
doch auch.
> Und wenn kein Taster gedrückt, sollen alle Blinklen.
Oben schrubst du nämlich, dass alle blinken sollen...

Ich rate dir dennoch, statt mit Waitms das mit 'nem Timer zu machen, 
auch wenn du es auch so hinbekommst. Für die Taster hab ich dir schon 
mehrfach den Tipp zu Debounce gegeben. Die BASCOM-Hilfe enthält 
Beispiele dafür!

Gruß
Dominique Görsch

von Stefan M. (likevista)


Lesenswert?

Eine neue Frage, würde dass mit sub Funktionieren bzw mit 5 Tastern?

Wie müsste ich das in den oben Geposteten Code intergrieren?

von Dominique G. (dgoersch)


Lesenswert?

Stefan Meyer wrote:
> würde dass mit sub Funktionieren bzw mit 5 Tastern?
Ich denk 2 Taster?

> Wie müsste ich das in den oben Geposteten Code intergrieren?
Eine Tastenabfrage (ohne Interrupts) macht in deinem Code keinen Sinn, 
weil die Schleife viel zu lange braucht, bis sie durchlaufen ist.

von Stefan M. (likevista)


Lesenswert?

Entschuldigung, wenn ich mich unklar ausgedrückt habe.

Möchte es mit ca. 5 Tastern machen, 1 für unterste led reihe, 2. Taster 
zweite reihe, 3. Taster 3. reihe Led's. 4. Taster Diagonale links unten 
nach rechts oben, 5. Taster von rechts unten nach links oben.

Mir ist auch egal ob ohne Taster druck alle gleichzeitig Blinken oder 
der Reihenach, wie oben.

Wie das mit Main-Loop oder Debounce funktionieren soll, weiß ich nicht 
NOCH nicht.

Wie müsste ich die Subs eigentlich markieren, bzw. einbinden?

von Stefan M. (likevista)


Lesenswert?

Was mach ich hier Falsch?

$regfile = "m8def.dat"
$crystal = 1000000

Config Portc.3 = Input
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output

Declare Sub Unterprogramm


Do
Portd. 2 = 1
Waitms 150
Portd. 2 = 0
Waitms 150

Portd. 3 = 1
Waitms 150
Portd. 3 = 0
Waitms 150

Portd. 4 = 1
Waitms 150
Portd. 4 = 0
Waitms 150

Portd. 5 = 1
Waitms 150
Portd. 5 = 0
Waitms 150

Portd. 6 = 1
Waitms 150
Portd. 6 = 0
Waitms 150

Portd. 7 = 1
Waitms 150
Portd. 7 = 0
Waitms 150

Portb. 0 = 1
Waitms 150
Portb. 0 = 0
Waitms 150

Portb. 1 = 1
Waitms 150
Portb. 1 = 0
Waitms 150

Portb. 2 = 1
Waitms 150
Portb. 2 = 0
Waitms 150
Loop





If Pinc.3 = 1 Then Gosub 1

Do

Loop


Sub Unterprogramm
Portc.5 = 1

End Sub

von Dominique G. (dgoersch)


Lesenswert?

Dein If Pinc.3 = 1 Then Gosub 1 wird nie erreicht, da der Controller die 
Schleife darüber abarbeitet.

von Stefan M. (likevista)


Lesenswert?

Kann ich das übverarbeiten irgentwie abstellen?

Wie muss ich das programmieren, das die 9LED's an verschiedenen 
Ausgängen gleichzeitig blinken?

von YS-500 (Gast)


Lesenswert?

Portd = 252 // LEDs aus
Portd = 0   // LEDs ein

von YS-500 (Gast)


Lesenswert?

Portd = 252 // LEDs aus
Portd = 0   // LEDs ein
Portb = 3   // LEDs aus
Portb = 0   // LEDs ein

von bauteiltöter (Gast)


Lesenswert?

Hi,

Ich schlage dir vor, den BASCOM-Kurs auf www.halvar.at GRÜNDLICH 
durchzulesen!
Dort stehen sehr viele interessante funktionen.

MfG Bauteiltöter

von Stefan M. (likevista)


Lesenswert?

Wenn ich das bei dem BASCOM-Kurs richtig verstanden habe, kann ich das 
mit dem AtMega8 gar nicht machen, da der nur 2 Ports hat, die als 
interrupt Port nutzen kann.

Ist das richtig?

von YS-500 (Gast)


Lesenswert?

Es gibt da noch den PinChangeInterrupt.
Da kannst Du jedem Pin einen Int. zuordnen.

von Dominique G. (dgoersch)


Lesenswert?

Halte deine Main-Loop kurz genug, schau das keine Waits drin sind, dann 
brauchst du für die Taster keine Interrupt.

von Stefan M. (likevista)


Lesenswert?

Würde das als Mainloop funktionieren?

Config Timer1 = Timer, Prescale = 8

Config Pinc.2 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Led1 Alias Portc.2

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq
Const Timervorgabe = 23869

Enable Timer1
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop

Timer_irq:
  Timer1 = Timervorgabe

   Toggle Led1
   Toggle Portd.2
   Toggle Portd.3
   Toggle Portd.4
   Toggle Portd.5
   Toggle Portd.6
   Toggle Portd.7
   Toggle Portb.0
   Toggle Portb.1
   Toggle Portb.2
   Return

Wie und wo müsste ich jetzt die Taster reinschreiben?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.