Bascom BASCOM ; Erste Schritte zum Ausprobieren

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo Jordy!

Am Besten machen wir jetzt hier mal weiter! :wink:

Ich habe zwar den Schaltungsaufbau ein wenig geändert und auch das Programm angepasst.....
Allerdings habe ich eben erst überlegt, ob ich die Beispiele besser auf deine Testplatine anpassen sollte. :hmmmm:

Das jetzige Beispiel bezieht sich also noch auf MEINEN Testaufbau!
Hier mal die Anschlussskizze:
Jordy_Test2.GIF
Achtung: Ich habe die LED`s jetzt an Port.D und nicht mehr an B !

Jetzt noch der Programmcode zum Ausprobieren dazu:
Code:
'Testprogramm-2 für Jordy

$regfile = "m8adef.dat"                                     'Controllerdatei
$crystal = 1000000                                          'interner Taktgeber
$hwstack = 32                                               'größe HW-Stack
$swstack = 32                                               'größe SW-Stack
$framesize = 64                                             'größe Framesize



'         ---------------ATMega8----------------
'                       +---v---+
'           (RESET) PC6 |1    28| PC5 (ADC5/SCL)
' LED_1-------(RXD) PD0 |2    27| PC4 (ADC4/SDA)
' LED_2-------(TXD) PD1 |3    26| PC3 (ADC3)
' LED_3------(INT0) PD2 |4    25| PC2 (ADC2)
' LED_4------(INT1) PD3 |5    24| PC1 (ADC1)
' LED_5----(XCK/T0) PD4 |6    23| PC0 (ADC0)
'                   VCC |7    22| GND
'                   GND |8    21| AREF
'     (XTAL1/TOSC1) PB6 |9    20| AVCC
'     (XTAL2/TOSC2) PB7 |10   19| PB5 (SCK)----------ISP
' LED_6--------(T1) PD5 |11   18| PB4 (MISO)---------ISP
' LED_7------(AIN0) PD6 |12   17| PB3 (MOSI/OC2)-----ISP
' LED_8------(AIN1) PD7 |13   16| PB2 (SS/OC1 B)
'            (ICP1) PB0 |14   15| PB1 (OC1A)
'                       +-------+

'*************************************************************
'Pins am Port B konfigurieren

'Port-Bit-7654_3210
'         |||| ||||
Ddrb = &B_1111_1011                                         '1 ist Ausgang 0 ist Eingang
Portb = &B0000_0100                                         'auf Hi oder Low setzen
' Pin0=
' Pin1=
' Pin2=
' Pin3= MOSI
' Pin4= MISO
' Pin5= SCK
' Pin6=
' Pin7=


'*************************************************************
'Pins am Port C konfigurieren
Ddrc = &B_00_0000                                           '1 ist Ausgang 0 ist Eingang
Portc = &B11_1111                                           'auf Hi oder Low setzen


'*************************************************************
'Pins am Port D konfigurieren
Ddrd = &B_1111_1111                                         '1 ist Ausgang 0 ist Eingang
Portd = &B0000_0000                                         'auf Hi oder Low setzen
' Pin0= LED_1
' Pin1= LED_2
' Pin2= LED_3
' Pin3= LED_4
' Pin4= LED_5
' Pin5= LED_6
' Pin6= LED_7
' Pin7= LED_8


'*************************************************************
'Variablen, Konstanten, Alias erstellen-----------------------
Led_1 Alias Portd.0                                         'Alias-Namen vergeben
Led_2 Alias Portd.1                                         'Alias-Namen vergeben
Led_3 Alias Portd.2                                         'Alias-Namen vergeben
Led_4 Alias Portd.3                                         'Alias-Namen vergeben
Led_5 Alias Portd.4                                         'Alias-Namen vergeben
Led_6 Alias Portd.5                                         'Alias-Namen vergeben
Led_7 Alias Portd.6                                         'Alias-Namen vergeben
Led_8 Alias Portd.7                                         'Alias-Namen vergeben

Const Ein = 1                                               'Konstante einstellen
Const Aus = 0                                               'Konstante einstellen


Dim I As Byte                                               'Indexzähler
Dim Flag As Bit                                             'ein einzelnes Bit



'Programmschleife*********************************************
Do

If Flag = 0 Then                                            'Wenn FLAG eine NULL hat, dann....
   Led_8 = Ein                                              'LED 8 einschalten
   Led_7 = Aus                                              'LED 7 ausschalten
Else                                                        'wenn FLAG nicht NULL ist, dann...
   Led_8 = Aus                                              'LED 8 ausschalten
   Led_7 = Ein                                              'LED 7 einschalten
End If


Toggle Flag                                                 'Wert umkehren
'TOGGLE bewirkt bei einem BIT das "Umschalten" des Wertes.
'Bei einem BIT gibt es nur NULL oder EINS !
'TOGGLE wechselt also bei jedem Aufruf den Zustand zwischen NULL und EINS

Waitms 500                                                  'Kleine Pause

Loop


End                                                         'end program


Du kannst dir ja mal ein paar Gedanken zum Ablauf in der DO-LOOP Schleife machen und anschließend schauen, was passiert! :cool:

Grüße,
Cassio
 
Abwechselndes Blinken

Hallo Cassio,

Vielen Dank für das neue Programm! Habe es kopiert und erstmal mit dem Steckboard gestartet. Es lief auf Anhieb!
Natürlich zuerst in der Regfile das a von m8adef entfernt.

Dann habe ich es zusätzlich unter anderem Namen abgespeichert für die Verwendung auf der andern Platine, wo die LED-Kathoden
nach GND gehen und nicht nach VCC. Da habe ich zuerst das falsche gemacht, es leuchtete nichts!
Mit einziger Änderung PORTD = &B_1111_1111 funktionierte es wieder!
Nun lese ich mich bei der Hilfe ein! Denn so einfach ist das nicht für mich. Habe die nächsten Tage damit zu tun.
Morgen und Ostermontag komme ich nicht dazu (Familie). Aber dann!

Da sind nun zahlreiche neue Befehle da, wie Dim, as, Byte, Else, if, Toggle. Die will ich gründlich durcharbeiten.

By the way, heute besuchte mich mein Sohn. Ich zeigte ihm voller Stolz meine ersten Schritte. Ich staunte, dass ihm dies
sehr bekannt vorkam. Er lernt nämlich seit einiger Zeit "Objective C" oder so ähnlich, welches Apple am MacBook Pro (Apple OS-X Lion)
gratis zur Verfügung stellt und "C" sehr ähnlich sein soll.

Danke erstmal! Noch frohe Osterfeiertage!
wünscht Dir Jordy
 
Diese Befehle gelernt!

Hallo Cassio,

habe mich in den letzten Tagen mit dem Testprogramm-2 für Jordy auseinander gesetzt (in Praxis und Theorie)! Zuerst nachgedacht was die Begriffe
bedeuten und dann diese in der Hilfe gerufen und gelesen, damit ich ihre Funktion besser verstehen kann. Auch unter anderer Datei abgespeichert und
damit experimentiert mit den rot gefärbten Befehlen und Systembegriffen:

$regfile
$crystal
$hwstack
$swstack
$framesize
DDRx
PORTx
Alias
CONST
DIM I as Byte
ELSE
If
flag
Toggle

Bei $crystal habe ich gemerkt, dass man bei Änderung des Wertes den Ablauf verzögern/beschleunigen kann. Alles andere ist mir auch mehr oder
weniger verständlich in dieser Schaltung. Nun wollte ich selbst einen Schritt weitergehen und Dich mit der Möglichkeit überraschen, die beiden
abwechselnd blinkenden LEDS zusätzlich mit einem Taster zu unterbrechen. Das heisst, wenn ich den Taster drücke die LEDs aufhören zu blinken
und wenn ich ihn wieder loslasse, blinken sie wieder wie zuvor. Das ist mir leider nicht gelungen!

Könntest Du mir bitte dazu eine Erweiterung schreiben? Da gibt es vielleicht verschiedene Möglichkeiten?

Nach Deiner Vorgangsweise lerne ich am besten! Schritt für Schritt mit Kommentaren und der Möglichkeit die Werte versuchsweise zu ändern.
Und nicht allzuviele neue Befehle auf einmal.

Off Topic: Kannst Du mir bitte sagen wie ich den senkrechten Strich im BASCOM-AVR Programm wegbekomme? Er stört, da er durch den
Kommentartext geht. Wie man den Beginn des Kommentars verschiebt, habe ich herausgefunden! Mit Options>Umgebung>Enviroment>Comment
position (60 default) ist mir das gelungen.

Gruß Jordy
 
Hallo Jordy!

Ich werde dir heute Abend mal mindestens ein passendes Programm- und Schaltungs-Beispiel mit einem Taster hier einstellen.
Tagsüber komme ich heute nicht dazu.....


Nur mal eben kurz zu der Anweisung $CRYSTAL
Mit $CRYSTAL teilst du BASCOM lediglich mit, welchen Systemtakt (interner oder externer Quarz) dein AVR verwendet.
Aus dieser Angabe berechnet BASCOM dann intern benötigte Zeitabstände, z.B. für den USART (serielle Baudrate).

Du MUSST also immer die richtige Systemfrequenz angeben, weil sonst dein Programm ggf. zu schnell oder zu langsam laufen würde.
Bei einer falschen Angabe, kann es daher auch zu "Fehlfunktionen" kommen.
Die serielle Schnittstelle funktioniert nicht richtig, IR-Codes werden falsch gesendet, DCF77-Signale können nicht ermittelt werden und und und.

Die Angabe $CRYSTAL ist also sehr wichtig und sollte der tatsächlich verwendeten Hardware (bzw. Systemtakt) entsprechen!
(Natürlich kann man mit der Angabe auch zu schnell oder zu langsam laufende interne Systemtakte ein wenig anpassen, aber das Thema lassen wir jetzt mal!)


Dann bis heute Abend, mit einem neuen Beispiel zum Ausprobieren.

Grüße,
Cassio
 
Hi Cassio, hi Jordy
nee, ich misch mich nicht in diesen "Unterricht" ein, aber ich möchte doch auf etwas hinweisen, da ich glaube, es muss sein.
(Natürlich kann man mit der Angabe auch zu schnell oder zu langsam laufende interne Systemtakte ein wenig anpassen, aber das Thema lassen wir jetzt mal!)
Bitte, nicht durch verändern der Angabe "Systemtakt" versuchen, die Geschwindigkeit eines Programmes zu verändern. Ist nicht gut.:rolleyes:
Weil, davon wird auch eine Baudrate bestimmt und andere Sachen, die auf irgend welche zeitrelevanten Abläufe im Controller zugreifen. Wenn du irrtümlich glaubst, man kann so Zeiten verändern, fällst du irgendwann einmal kräftig auf die Schn... :hmmmm:
Nimm diesen Wert immer als Konstante an, es sei denn, du hast einen steckbaren Quarz und übst damit. In Assembler könnt ich dir sagen, wie du verschiedene Zeitabläufe mit dem Timer hinbekommst, aber ich denke, Cassio wird dir das auch in Basic sagen können. Den Timer betrachte einfach mal wie eine Unruh in einer Uhr. Zu festgelegten Zählwerten des Prozessortaktes wird ein Interrupt ausgeführt. Und da der Prozessortakt, z.B. mit 8 MHz einen Zeitwert pro Takt 125 Nanosekunden dauert, kann damit eine Zeitsteuerung aufgebaut werden. Aber jetzt halte ich an. Ihr macht das so schön, warum soll ich mich jetzt einmischen.:yes4:
Gruß oldmax
 
Hallo Jordy,

den "senkrechten Strich" bekommst du weg, indem du unter Options>Umgebung>Enviroment>Show Margin den Hacken raus machst.
 
Hallo Jordy!

Na, dann wollen wir mal wieder etwas Neues lernen. :cool:


Bei diesem Beispiel bin ich deiner Bitte gefolgt und habe einen "Eingabetaster" mit ins Programm aufgenommen.
Eigentlich wollte ich das erst etwas später machen, aber OK....... :wink:

Hier also der neue Anschlussplan (ich habe die LED`s nun auch fest mit GND verbunden):
Jordy_Test3.GIF

Der Taster liegt an PC.0 und er hat einen kleinen Kondensator zum Entprellen bekommen.
(Bitte zu diesem Zeitpunkt keine Diskusionen wegen dem Kondensator. Danke!)


Hier nun das neue Testprogramm:
Code:
'Testprogramm 3 für Jordy

$regfile = "m8def.dat"                                     'Controllerdatei
$crystal = 1000000                                          'interner Taktgeber
$hwstack = 32                                               'größe HW-Stack
$swstack = 32                                               'größe SW-Stack
$framesize = 64                                             'größe Framesize



'         ---------------ATMega8----------------
'                       +---v---+
'           (RESET) PC6 |1    28| PC5 (ADC5/SCL)
' LED_1-------(RXD) PD0 |2    27| PC4 (ADC4/SDA)
' LED_2-------(TXD) PD1 |3    26| PC3 (ADC3)
' LED_3------(INT0) PD2 |4    25| PC2 (ADC2)
' LED_4------(INT1) PD3 |5    24| PC1 (ADC1)
' LED_5----(XCK/T0) PD4 |6    23| PC0 (ADC0)-------Taster_1
'                   VCC |7    22| GND
'                   GND |8    21| AREF
'     (XTAL1/TOSC1) PB6 |9    20| AVCC
'     (XTAL2/TOSC2) PB7 |10   19| PB5 (SCK)----------ISP
' LED_6--------(T1) PD5 |11   18| PB4 (MISO)---------ISP
' LED_7------(AIN0) PD6 |12   17| PB3 (MOSI/OC2)-----ISP
' LED_8------(AIN1) PD7 |13   16| PB2 (SS/OC1 B)
'            (ICP1) PB0 |14   15| PB1 (OC1A)
'                       +-------+

'*************************************************************
'Pins am Port B konfigurieren

'Port-Bit-7654_3210
'         |||| ||||
Ddrb = &B_1111_1011                                         '1 ist Ausgang 0 ist Eingang
Portb = &B0000_0100                                         'auf Hi oder Low setzen
' Pin0=
' Pin1=
' Pin2=
' Pin3= MOSI
' Pin4= MISO
' Pin5= SCK
' Pin6=
' Pin7=


'*************************************************************
'Pins am Port C konfigurieren
Ddrc = &B_00_0000                                           '1 ist Ausgang 0 ist Eingang
Portc = &B11_1111                                           'auf Hi oder Low setzen


'*************************************************************
'Pins am Port D konfigurieren
Ddrd = &B_1111_1111                                         '1 ist Ausgang 0 ist Eingang
Portd = &B0000_0000                                         'auf Hi oder Low setzen
' Pin0= LED_1
' Pin1= LED_2
' Pin2= LED_3
' Pin3= LED_4
' Pin4= LED_5
' Pin5= LED_6
' Pin6= LED_7
' Pin7= LED_8


'*************************************************************
'Variablen, Konstanten, Alias erstellen-----------------------
Led_1 Alias Portd.0                                         'Alias-Namen vergeben
Led_2 Alias Portd.1                                         'Alias-Namen vergeben
Led_3 Alias Portd.2                                         'Alias-Namen vergeben
Led_4 Alias Portd.3                                         'Alias-Namen vergeben
Led_5 Alias Portd.4                                         'Alias-Namen vergeben
Led_6 Alias Portd.5                                         'Alias-Namen vergeben
Led_7 Alias Portd.6                                         'Alias-Namen vergeben
Led_8 Alias Portd.7                                         'Alias-Namen vergeben

Const Ein = 1                                               'Konstante einstellen
Const Aus = 0                                               'Konstante einstellen


Taster1 Alias Pinc.0                                        'Eingabetaster 1


Dim I As Byte                                               'Indexzähler
Dim Flag As Bit                                             'ein einzelnes Bit



'Programmschleife-Anfang*********************************************
Do

'Befehlsebene-----------------------
If Taster1 = 0 Then                                         'Wenn der Taster gedrückt ist dann....
   Led_8 = Ein                                              'LED 8 einschalten
   Toggle Flag                                              '"Umschalten" des Flags, 1 oder 0
      Bitwait Taster1 , Set                                 'Warte, bis der Taster wieder losgelassen wurde
      Led_8 = Aus                                           'LED 8 ausschalten
Else
End If

'(
Hinweise zur Funktion:
Bitwait sorgt dafür dass dein Programm solange wartet,
bis der Controllerpin C.0 wieder HIGH (Set) ist!

Durch die Aktivierung des internen PullUP-Widerstandes,
(dies geschieht durch DDRC =.... und PORTC = ....)
hat der Controllerpin C.0 bei geöffnetem Taster eine logische EINS !
Wird der Taster betätigt, liegt GND-Potential bei C.0 an.... also eine logische NULL!
')



'Executivebene----------------------
If Flag = 1 Then                                            'Wenn FLAG eine EINS hat, dann....
   Led_7 = Ein                                              'LED 7 einschalten
Else                                                        'wenn FLAG nicht EINS ist, dann...
   Led_7 = Aus                                              'LED 7 ausschalten
End If


Loop
'Programmschleife-Ende***********************************************


End                                                         'end program


Vielleicht hast du beim Durchsehen des Programmes schon so eine Ahnung, wie es funktionieren könnte und wann die beiden LED`s wohl leuchten werden.
Die Lösung siehst du sonst nach dem Flashen des Programms. :wink:

Es gibt auch wieder einen neuen Befehl (BITWAIT), den du dir ja schon mal ansehen kannst.

Grüße und viel Spaß beim Ausprobieren,
Cassio
 
Hallo Jordy!

Ich habe auf der Basis des Testprogramm-2 nun dass nächste Programm für dich fertig. :D

Es gibt natürlich wieder einen neuen Befehl.... :wink:
Die Funktionen der beiden LED`s sind nun etwas anders.
Sieh es dir aber erst einmal an und probiere es dann aus.
Hier das neue Testprogramm-3:
Code:
'Testprogramm 3 für Jordy

$regfile = "m8def.dat"                                     'Controllerdatei
$crystal = 1000000                                          'interner Taktgeber
$hwstack = 32                                               'größe HW-Stack
$swstack = 32                                               'größe SW-Stack
$framesize = 64                                             'größe Framesize



'         ---------------ATMega8----------------
'                       +---v---+
'           (RESET) PC6 |1    28| PC5 (ADC5/SCL)
' LED_1-------(RXD) PD0 |2    27| PC4 (ADC4/SDA)
' LED_2-------(TXD) PD1 |3    26| PC3 (ADC3)
' LED_3------(INT0) PD2 |4    25| PC2 (ADC2)
' LED_4------(INT1) PD3 |5    24| PC1 (ADC1)
' LED_5----(XCK/T0) PD4 |6    23| PC0 (ADC0)-------Taster_1
'                   VCC |7    22| GND
'                   GND |8    21| AREF
'     (XTAL1/TOSC1) PB6 |9    20| AVCC
'     (XTAL2/TOSC2) PB7 |10   19| PB5 (SCK)----------ISP
' LED_6--------(T1) PD5 |11   18| PB4 (MISO)---------ISP
' LED_7------(AIN0) PD6 |12   17| PB3 (MOSI/OC2)-----ISP
' LED_8------(AIN1) PD7 |13   16| PB2 (SS/OC1 B)
'            (ICP1) PB0 |14   15| PB1 (OC1A)
'                       +-------+

'*************************************************************
'Pins am Port B konfigurieren

'Port-Bit-7654_3210
'         |||| ||||
Ddrb = &B_1111_1011                                         '1 ist Ausgang 0 ist Eingang
Portb = &B0000_0100                                         'auf Hi oder Low setzen
' Pin0=
' Pin1=
' Pin2=
' Pin3= MOSI
' Pin4= MISO
' Pin5= SCK
' Pin6=
' Pin7=


'*************************************************************
'Pins am Port C konfigurieren
Ddrc = &B_00_0000                                           '1 ist Ausgang 0 ist Eingang
Portc = &B11_1111                                           'auf Hi oder Low setzen


'*************************************************************
'Pins am Port D konfigurieren
Ddrd = &B_1111_1111                                         '1 ist Ausgang 0 ist Eingang
Portd = &B0000_0000                                         'auf Hi oder Low setzen
' Pin0= LED_1
' Pin1= LED_2
' Pin2= LED_3
' Pin3= LED_4
' Pin4= LED_5
' Pin5= LED_6
' Pin6= LED_7
' Pin7= LED_8


'*************************************************************
'Variablen, Konstanten, Alias erstellen-----------------------
Led_1 Alias Portd.0                                         'Alias-Namen vergeben
Led_2 Alias Portd.1                                         'Alias-Namen vergeben
Led_3 Alias Portd.2                                         'Alias-Namen vergeben
Led_4 Alias Portd.3                                         'Alias-Namen vergeben
Led_5 Alias Portd.4                                         'Alias-Namen vergeben
Led_6 Alias Portd.5                                         'Alias-Namen vergeben
Led_7 Alias Portd.6                                         'Alias-Namen vergeben
Led_8 Alias Portd.7                                         'Alias-Namen vergeben

Const Ein = 1                                               'Konstante einstellen
Const Aus = 0                                               'Konstante einstellen


Taster1 Alias Pinc.0                                        'Eingabetaster 1


Dim I As Byte                                               'Indexzähler
Dim Flag As Bit                                             'ein einzelnes Bit



'Programmschleife-Anfang*********************************************
Do

'Befehlsebene-----------------------
If Taster1 = 0 Then                                         'Wenn der Taster gedrückt ist dann....
   Led_8 = Aus                                              'LED 8 ausschalten
   Toggle Flag                                              '"Umschalten" des Flags, 1 oder 0
   Bitwait Taster1 , Set                                    'Warte, bis der Taster wieder losgelassen wurde
Else
   Led_8 = Ein                                              'LED 8 einschalten
End If





'Executivebene----------------------
If Flag = 1 Then                                            'Wenn FLAG eine EINS hat, dann....
   For I = 1 To 3                                           'Zähle I von 1 bis 3
      Led_7 = Ein                                           'LED 7 einschalten
      Waitms 250                                            'Warten
      Led_7 = Aus                                           'LED 7 ausschalten
      Waitms 250                                            'Warten
   Next I                                                   'gehe wieder zu FOR
      Flag = 0
Else
End If

'(
Die FOR-NEXT Schleife wird so lange durchlaufen,
bis die angegebene Variable (bei uns I ) den gewünschten Endwert erreicht.
Wenn der Endwert erreicht ist, wird die gesamte FOR-NEXT Schleife übergangen!
')


Loop
'Programmschleife-Ende***********************************************


End                                                         'end program


Der Schaltplan hat sich dabei natürlich nicht geändert!


Wenn du das neue Programmm dann ebenfalls ausprobiert hast folgt von meiner Seite aus erst mal ein Resümee, was du alles so gelernt haben solltest.
Schließlich sollst du ja wissen, was ich mir bei den Testprogrammen so gedacht habe. :wink:


Grüße und viel Spaß,
Cassio
 
Nachfrage wegen Schaltungsergebnissen

Hallo Cassio und alle anderen Freunde,

StevieL
den "senkrechten Strich" bekommst du weg, indem du unter Options>Umgebung>Enviroment>Show Margin den Hacken raus machst.
Danke für den Hinweis! Nun ist die Marginallinie weg.
oldmax
Bitte, nicht durch verändern der Angabe "Systemtakt" versuchen, die Geschwindigkeit eines Programmes zu verändern. Ist nicht gut.
Danke, weiß es inzwischen und will hier niemals eine Änderung machen. Nur viel später mal in Zusammenhang mit ext. Quarz
und dementsprechender FUSE-Einstellung. Aber da kenne ich mich nicht aus und lasse die Finger davon.

Cassio, nun zu Deinen letzten beiden Programmen welche ich nachvollzogen habe.
Zuerst mal danke für Deine Mühe!

Leider sind sie gleich benannt. Deshalb habe ich jenes vom
Beitrag #7 unter Testprogramm-3 für Jordy.bas gelassen,
das vom Beitrag #8 unter Testprogramm-4 für Jordy.bas abgespeichert.

Bevor ich mich mit beiden Schaltung näher beschäftige, will ich erst die Ergebnisse anführen.
Dies deshalb, da ich bei Testpogramm-3 glaubte es sollten beide LEDs abwechselnd blinken. Daher glaubte ich ursprünglich,
dass ich was falsch aufbaute. Habe lange gerätselt und mich sehr lange mit der Fehlersuche in der Hardware beschäftigt. Dann bin
ich erst draufgekommen, dass es so gemeint ist.

Bei Programm 3:
LED_7 (rot auf PD6) Dauerleuchten.
Während Drücken Taster1 leuchtet zusätzlich LED_8 (gelb auf PD7)
Bei Loslassen Taster1 LED_7 wieder finster.
Die Led_7 kann man mit dem Taster1 ein/ausschalten.
LED_8 leuchtet nur während Taster1 gedrückt ist.


Bei Programm 4:
LED_8 Dauerleuchten
Nach Tastenbetätigung und loslassen leuchtet L7 3x auf (LED_8 derweil finster) und verlöscht dann.
Dann wieder Dauerleuchten LED_8. (Während Taster gedrückt - alles finster!)
Nach neuerlicher Tastenbetätigung wiederholt sich alles.

Ich hoffe das war so beabsichtigt? Dann habe ich alles mal richtig angeschlossen!

Nun will ich mich mit den Befehlen beschäftigen. Ist kein Zuckerschlecken für einen Anfänger, diese Schaltung zu verstehen.
Aber es wird schon werden!

Danke einstweilen!
Gruß Jordy
 
Hallo Jordy!

Ich finde, du machst das ganz gut! :)

Es war von mir natürlich beabsichtigt, dich mit der Funktion erst einmal "im Regen" stehen zu lassen.
Du solltest ja schließlich selbst heraus finden, wie das Programm funktionieren sollte..... und was am Ende tatsächlich passiert. :cool:

Bei den nächsten Programmen werde ich dir aber in Kurzform eine Beschreibung geben, was passieren soll.
Das Lernen ist dann um einiges einfacher. :wink:


Nun aber mal zu den Programmen.....

Die Haupt-Arbeits-schleife von Test-2 sah so aus:
Code:
Do

If Flag = 0 Then                                            'Wenn FLAG eine NULL hat, dann....
   Led_8 = Ein                                              'LED 8 einschalten
   Led_7 = Aus                                              'LED 7 ausschalten
Else                                                        'wenn FLAG nicht NULL ist, dann...
   Led_8 = Aus                                              'LED 8 ausschalten
   Led_7 = Ein                                              'LED 7 einschalten
End If


Toggle Flag                                                 'Wert umkehren
'TOGGLE bewirkt bei einem BIT das "Umschalten" des Wertes.
'Bei einem BIT gibt es nur NULL oder EINS !
'TOGGLE wechselt also bei jedem Aufruf den Zustand zwischen NULL und EINS

Waitms 500                                                  'Kleine Pause

Loop

Bei diesem Programm ging es mir darum, dass du dir die Verwendung eines Flag`s (oder Merker) einmal vor Augen führst.
Da die Variable Flag nur ein Bit ist....
Code:
Dim Flag As Bit
....kann sie nur Werte von NULL oder EINS annehmen!

Im Programm weisen wir der Variable aber gar keine Werte auf direktem Wege zu!
Es wird lediglich der Wert durch den Befehl TOGGLE gewechselt..... mehr nicht!

Das liegt daran, dass die Variable beim Start des Programms den Wert NULL erhält.
Später wird im Programm die Variable dann durch TOGGLE "umgeschaltet"..... und sie hat danach den Wert EINS!


Am Anfang des Programms prüfen wir mit einer IF-ELSE-THEN Bedingung die Variable...... und reagieren auch darauf.
Code:
If Flag = 0 Then
   Led_8 = Ein                                              'LED 8 einschalten
   Led_7 = Aus                                              'LED 7 ausschalten
Wenn also Flag den Wert NULL hat, dann soll etwas passieren.....
In diesem Fall sollte also LED_8 leuchten und LED_7 dunkel sein.
So weit, so gut!

Was ist aber, wenn Flag durch das TOGGLE plötzlich den Wert EINS hat?
Dafür ist der zweite Abschnitt zuständig:
Code:
Else                                                        'wenn FLAG nicht NULL ist, dann...
   Led_8 = Aus                                              'LED 8 ausschalten
   Led_7 = Ein                                              'LED 7 einschalten
Wenn also Flag NICHT den Wert NULL hat, dann soll die LED_8 dunkel werden, aber dafür LED_7 leuchten!

Nach einer Wartezeit von 500ms wird das Programm, durch die DO-LOOP Anweisung wiederholt.
Da war auch schon das ganze Programm! :cool:

Gelernt hast du dabei....
Was macht ein Flag (Merker)?
Wie überprüfe ich ein Ereignis und wie reagiere ich darauf? (IF-THEN)
Wie kann ich einen Zustand "umschalten"? (TOGGLE)




Im Testprogramm-3 kam etwas Neues hinzu.....
Ein "Softwareschalter" oder eine Selbsthaltung, wie der Elektriker sagen würde. :wink:
Hier noch mal die Hauptschleife:
Code:
'Programmschleife-Anfang*********************************************
Do

'Befehlsebene-----------------------
If Taster1 = 0 Then                                         'Wenn der Taster gedrückt ist dann....
   Led_8 = Ein                                              'LED 8 einschalten
   Toggle Flag                                              '"Umschalten" des Flags, 1 oder 0
      Bitwait Taster1 , Set                                 'Warte, bis der Taster wieder losgelassen wurde
      Led_8 = Aus                                           'LED 8 ausschalten
Else
End If



'Executivebene----------------------
If Flag = 1 Then                                            'Wenn FLAG eine EINS hat, dann....
   Led_7 = Ein                                              'LED 7 einschalten
Else                                                        'wenn FLAG nicht EINS ist, dann...
   Led_7 = Aus                                              'LED 7 ausschalten
End If


Loop
'Programmschleife-Ende***********************************************

Durch die Verwendung des Flag`s können wir das Programm in zwei "Teile" zerlegen.....
Der obere Bereich dient als "Befehlsebene" und der untere Bereich als "Ausführungsebene".

Was passierte in diesem Programm nun?
Oben gibt es die nun schon bekannte IF-THEN Abfrage.
Wir überprüfen etwas (einen Pin vom Controller) und reagieren darauf!

Wenn also der Taster gedrückt wird, ist der Pin am Controller mit GND verbunden.
Aus dem Grunde muss er auch eine NULL am Eingang haben.
Genau dies überwachen wir mit "If Taster1 = 0 Then".....
Code:
If Taster1 = 0 Then                                         'Wenn der Taster gedrückt ist dann....
   Led_8 = Ein                                              'LED 8 einschalten
   Toggle Flag                                              '"Umschalten" des Flags, 1 oder 0
      Bitwait Taster1 , Set                                 'Warte, bis der Taster wieder losgelassen wurde
      Led_8 = Aus                                           'LED 8 ausschalten
Else
End If

Wenn also der PinC.0 (den wir den Aliasnamen "Taster1" gegeben haben) eine NULL hat,
dann folgt plötzlich eine ganze Reihe von Reaktionen!
Erst einmal wird zur optischen Kontrolle, dass der Taster gedrückt wurde, die LED_8 eingeschaltet.
Danach togglen wir den Wert der Variable Flag.
Anschließend warten wir mit BITWAIT darauf, dass der Taster wieder losgelassen wird.

-----schnipp----
BITWAIT ist eine Anweisung die dein gesamtes Programm so lange anhält (bzw. in eine Warteschleife packt), bis der Zustand tatsächlich erfüllt ist!
Mit diesem Befehl sollte man also etwas vorsichtig sein. :wink:

Die Syntax von BITWAIT ist relativ einfach zu verstehen.
Es gibt nur SET (bedeutet EINS), oder RESET (bedeutet NULL) und die Angabe, was du überwachen möchtest.
In unserem Fall war das der PinC.0 bzw. der alias Taster1.
-----schnapp----


Wenn nun der Taster wieder losgelassen wurde hat dies die LED_8 auch optisch angezeigt, in dem sie verloschen ist.
Damit war die Abfrage nun zu Ende!

Weil nach der Anweisung ELSE keine Angaben folgen, wird also auch nicht darauf reagiert, wenn Taster1 eine EINS haben sollte! :wink:
Unsere IF-THEN Abfrage soll also NUR auf den gedrückten Taster reagieren.... sonst nicht!



Nun kommt der zweite Teil des Programms.....
Code:
If Flag = 1 Then                                            'Wenn FLAG eine EINS hat, dann....
   Led_7 = Ein                                              'LED 7 einschalten
Else                                                        'wenn FLAG nicht EINS ist, dann...
   Led_7 = Aus                                              'LED 7 ausschalten
End If

Wir überprüfen das Flag und reagieren darauf.
Diesmal reagieren wir jedoch auf beide Werte der Variable!
Wenn Flag eine EINS hat, dann soll die LED_7 leuchten......
wenn nicht, dann soll die LED_7 dunkel sein!

Das Interessante ist nun.....
Die LED_7 wird so lange leuchten (oder dunkel sein) bis wir den Tatser das nächste Mal betätigen!
Selbst wenn das erst am nächsten Tag, oder im nächsten Jahr sein sollte. :wink:


Warum ging es mir bei diesem Programm?
Du solltest einmal lernen, dass man auch indirekt etwas steuern kann.
Wir hätten die LED_8 auch hardwaretechnisch mit dem Taster verbinden können, damit sie beim Betätigen leuchtet.
Durch die "softwarevariante" hast du bemerkt, dass wir dies aber gar nicht müssen.
Dann solltest du sehen, dass in einer IF-THEN Abfrage nicht nur ein oder zwei Variablen zugewiesen werden können,
sondern dass sogar neue Befehle berücksichtigt werden (BITWAIT).
Außerdem hast du gelernt, wie man das Programm nach Aufgaben "teilen" kann!
Dies wird dann besonders interessant, wenn wir die "Executivebene" nicht mehr in der DO-LOOP Schleife unterbringen.... sondern in eine Subroutine auslagern werden. :wink:




So, nun mache ich erst mal eine Kaffeepause und danach folgt die Beschreibung zum Testprogramm-4 ! :D

Bis gleich,
Cassio
 
Hallo Jordy!

Nun geht es also mit der Erklärung zu Testprogramm-4 weiter.....


Hier noch mal die Hauptschleife:
Code:
'Programmschleife-Anfang*********************************************
Do

'Befehlsebene-----------------------
If Taster1 = 0 Then                                         'Wenn der Taster gedrückt ist dann....
   Led_8 = Aus                                              'LED 8 ausschalten
   Toggle Flag                                              '"Umschalten" des Flags, 1 oder 0
   Bitwait Taster1 , Set                                    'Warte, bis der Taster wieder losgelassen wurde
Else
   Led_8 = Ein                                              'LED 8 einschalten
End If


'Executivebene----------------------
If Flag = 1 Then                                            'Wenn FLAG eine EINS hat, dann....
   For I = 1 To 3                                           'Zähle I von 1 bis 3
      Led_7 = Ein                                           'LED 7 einschalten
      Waitms 250                                            'Warten
      Led_7 = Aus                                           'LED 7 ausschalten
      Waitms 250                                            'Warten
   Next I                                                   'gehe wieder zu FOR
      Flag = 0
Else
End If

Loop
'Programmschleife-Ende***********************************************

Wie bei den anderen Testprogrammen auch, prüfen wir wieder ein Ereignis und reagieren dann darauf. :wink:
Wieder einmal prüfen wir den Zustand des "Tasters" (genau genommen nur den Pin des Controllers mit dem der Taster verbunden ist, aber umgangssprachlich passt das schon :cool: ).

Diesmal habe ich es aber so gemacht.....
Wenn der Taster NICHT betätigt wird, soll die LED_8 dies anzeigen, in dem sie leuchtet.
Sobald der Taster gedrückt wird meldet uns dies die LED_8, weil sie aus geht.
Danach togglen wir wieder mal unser Flag (also von NULL auf EINS !) und
anschließend warten wir drauf, dass der Taster wieder losgelassen wird.

Sobald der Taster also nicht mehr gedrückt wird, wird das Programm fortgesetzt....
Das Flag besitzt nun den Wert EINS und die LED_8 ist immer noch dunkel!

Nun kommen wir zur Executivebene:
Hier wird nun das Flag überprüft.
Hat das Flag eine EINS, folgen (genau genommen) nur zwei Anweisungen.
Gleich zu Beginn wird ein neuer Befehl ausgeführt.... eine FOR-NEXT Schleife, die wie ein Zählwerk funktioniert.
Hier haben wir auch endlich mal die Variable I benötigt, die wir bereits im Header als Byte dimensioniert haben:
Code:
Dim I As Byte
Der Buchstabe I steht für "Indexzähler". Er wird dir in zig Beispielprogrammen wohl noch mal begegnen. :wink:
Da die Variable I nun ein Byte ist, kann es ganze Zahlen im Wert von NULL bis 255 annehmen.
Aus dem Grunde, können wir I auch gut für unser "Zählwerk", die FOR-NEXT Schleife, verwenden!

Im Programm steht nun, dass wir von 1 bis 3 zählen wollen.
Wie schnell dies jedoch passieren soll, müssen wir noch angeben.
Damit das "Zählen" für das menschliche Auge auch gut sichtbar wird, nutzen wir die LED_7 und eine entsprechend große Pause von 500ms.
Die Pause von 500ms müssen wir noch in zwei Teile zerlegen, weil die LED_7 für jeden Zählvorgang einmal EIN und einmal AUS sein soll.
Demnach benötigen wir also zwei Pausen von 250ms und die LED_7 muss dabei EIN- und auch wieder AUS-geschaltet werden.
Aus diesen Vorgaben ergibt sich die nachfolgende FOR-NEXT Schleife:
Code:
   For I = 1 To 3                                           'Zähle I von 1 bis 3
      Led_7 = Ein                                           'LED 7 einschalten
      Waitms 250                                            'Warten
      Led_7 = Aus                                           'LED 7 ausschalten
      Waitms 250                                            'Warten
   Next I

Was passiert hier?
Nutze Variable I und zähle von 1 bis 3, in ganzen Schritten.
Der erste Wert ist also 1 !
Danach schalte die LED_7 ein....
dann warte 250ms....
schalte LED_7 wieder aus....
warte wieder 250ms....
als nächstes (NEXT) gehe wieder zu I !

Nun beginnt das Ganze wieder von vorn, bis I den Wert = 3 hat.
Wenn I nun gleich 3 ist, werden ALLE Anweisungen ebenfalls ausgeführt...... sogar das NEXT I (also weiter zählen)!!!
Nun wird die Variable I auf den Wert 4 erhöht! :eek:
Da die Anweisung von uns aber lautet: Zähle nur bis 3, wird mit dem Erreichen von I= 4 die FOR-NEXT Schleife beendet!

Da unser Flag aber immer noch den Wert EINS hat, setzen wir es nach dem Fertigstellen des Zählerwerkes auf NULL zurück.
Dies geschieht mit einem einfachen: "Flag = 0" !
Ich hätte auch schreiben können: "Reset Flag" (was das Gleiche bedeutet !)

Anschließend beginnt das Programm wieder von vorn......



Mir ging es mit diesem Programm darum, dass du die Verwendung von FOR-NEXT verstehst.
Es ist also ähnlich wie ein Zählwerk.
Wie schnell allerdings gezählt wird hängt von deinem Systemtakt ab.... wenn du selber keine festen Zeitabstände mitlieferst (z.B. Waitms 250).
Wichtig ist auch zu wissen, dass die angegebene Variable tatsächlich um eins mehr erhöht wird, also wir es angegeben haben!
Der Rest im Programm sollte nur als Wiederholung dienen und dir zeigen, warum IF-THEN so oft verwendet werden kann.


Du kannst mit dem Programm ja mal etwas rumspielen.
Wenn du in die Hilfe zu FOR-NEXT schaust, wirst du z.B. auch auf den Zusatz STEP stoßen.
STEP dient dazu, die Schrittweite zu erhöhen...... oder sogar negativ zu zählen.
Hier mal zwei Beispiele zum Ausprobieren:
Code:
   For I = 1 To 30 Step 10                             
      Led_7 = Ein                                           'LED 7 einschalten
      Waitms 250                                            'Warten
      Led_7 = Aus                                           'LED 7 ausschalten
      Waitms 250                                            'Warten
   Next I

...oder so....
Code:
   For I = 5 To 1 Step -1                             
      Led_7 = Ein                                           'LED 7 einschalten
      Waitms 250                                            'Warten
      Led_7 = Aus                                           'LED 7 ausschalten
      Waitms 250                                            'Warten
   Next I

Das soll es nun erst mal zum Testprogramm-4 und seinen Möglichkeiten gewesen sein!


Natürlich verstecken sich noch einige unterschwellige "Lerneffekte" in den Beispielprogrammen, aber alles muss ich ja auch nicht verraten. :cool:



Als nächstes werde ich mal KEIN neues Testprogramm hier einstellen, sondern wir werfen mal einen kleinen Blick "in den Controller".
Wie das funktioniert und wie ich das meine, wirst du hier bald sehen und lesen. :D
Danach geht es dann mit neuen Programmen weiter.


Wenn du zu irgend etwas Fragen haben solltest, dann raus damit! :wink:

Viele Grüße,
Cassio
 
Hallo Jordy!

Wie ich im Beitrag oben drüber schon angekündigt habe, werden wir jetzt mal einen (virtuellen) Blick in den Controller werfen.
Dafür nutzen wir natürlich keine Säge oder Bohrmaschine, sondern den Simulator! :wink:


Als Basis verwenden wir das Testprogramm-4, mit der FOR-NEXT Schleife.
Das Programm funktioniert und du hast es ja schon mal kompiliert.

Damit das Programm aber für den Simulator optimiert abläuft, musst du oben im Programm noch eine zusätzliche Angabe machen:
Code:
'Testprogramm 4 für Jordy
[COLOR="#FF0000"]$sim[/COLOR]

$regfile = "m8adef.dat"                                     'Controllerdatei
$crystal = 1000000                                          'interner Taktgeber
$hwstack = 32                                               'größe HW-Stack
$swstack = 32                                               'größe SW-Stack
$framesize = 64                                             'größe Framesize


Schau dann bitte noch mal in die BASCOM/Options ob folgende Haken gesetzt sind:
BASCOM_Options.gif

Damit der Simulator auch funktioniert, müssen bei "Debug File" und "AVR Studio Object file" auf alle Fälle die Haken gesetzt sein!
Nun kannst du das Programm noch mal neu kompilieren (z.B. F7 drücken)!


Danach klickst du auf den roten Chip in der Menüleiste--> Flash_Button.gif

Kurz darauf startet der Simulator in einem neuen Fenster!
Simulator_Startbild.gif

Stell den Simulator bei dir bitte auch so ein, wie du es auf dem Bild von mir sehen kannst!
Rechts sollte der (Speicher)Memory-Bereich (hexadezimal) angezeigt werden.
Die Anzeige der Bytes im Speicher kann man auch auf binär und dezimal umschalten.... aber wir lassen es mal bei hexadezimal!

Im linken gelben Bereich trägst du die beiden Variablen "FLAG" und "I" in jeweils eine Zeile ein.
(Den Tippfehler "Varablen" auf dem Bild, musst du nicht so ernst nehmen :wink: ).


Im rechten Memory-Fenster habe ich zwei Angaben gemacht......
Speicherzelle 0060 beinhaltet unsere Variable I (ein Byte)
Speicherzelle 0061 beinhaltte unsere Variable FLAG (ein Bit)

Da jede Speicherzelle ein Byte groß ist.... also 8 bit aufnehmen kann ....belegt unser einzelnes Bit der Variable FLAG trotzdem das ganze Byte!
Wenn du später mehrere einzelne Variablen als Bit dimensionierst, werden alle Bit`s in der Speicherzelle abgelegt.... bis sie mit 8 bit voll ist.
Aus dem Grunde nennt sich die Speicherzelle im Simulator auch nicht FLAG, sondern BITBYTE0 (Bit-Byte das Erste).


Da BASCOM die Variablen der Reihe nach im Speicher ablegt wie wir sie dimensioniert haben......
Hier noch mal der Blick auf unsere Angaben:
Code:
Dim I As Byte                                               'Indexzähler
Dim Flag As Bit                                             'ein einzelnes Bit
....kommt also erst das I und dann das FLAG !

Genauso steht es auch im Simulator......
Erste Speicherzelle 0060 = Variable I
Zweite Speicherzelle 0061 = FLAG (BITBYTE0)

Ob das wirklich so ist, kannst du ganz einfach überprüfen.
Du musst lediglich nur einmal mit der Maus auf die Speicherzelle klicken, dann wird unten am Rand der Name der Variable angezeigt "Occupied by: "! :wink:


Nun hätten wir fast alles soweit vorbereitet, um das Programm im Simulator laufen lassen zu können!
Wie das funktioniert, kommt im nächsten Beitrag. :)

Grüße,
Cassio
 
Hallo Jordy, weiter gehts.....


Theoretisch haben wir nun fast alles was wir brauchen, um das Programm zu testen.
Was uns nun noch fehlt ist ein virtueller Taster und die LED`s zur Anzeige.

Damit man das auch simulieren und beobachten kann, musst du das Zusatzfenster zur Hardware-Simulation aktivieren.
Wie das geht, kannst du hier sehen:
Simulator_LCD.gif

Ich habe das Bild schon entsprechend beschriftet, darum kann ich mir hier weitere Erklärungen wohl sparen. :cool:

Trotzdem noch mal ein paar Zeilen zu PB, PC, PD sowie IB, IC und ID !
Die "LED`s" signalisieren nur den Zustand am PIN des CONTROLLERS!

Erinnere dich bitte......
Wenn unser Taster NICHT gedrückt ist, dann liegt Vcc-Potential am Controller-Pin C.0 an!
Du musst also nach dem Start der Simulation auf die grüne "LED" klicken, damit sie leuchtet und damit der Zustand des geöffneten Tasters signalisiert wird!
Wenn die "LED" nicht leuchtet bedeutet das logischer Weise, dass der Taster gedrückt wurde!


Nun kann es also losgehen....
Mit dem Klick auf das "Play" Symbol rennt das Programm auch schon los!
Im rechten Memory-Fenster kannst du sehen, wie alle Speicherbereiche mit NULL gefüllt und dabei rot werden.
Da der PinC.0 natürlich noch nicht aktiviert ist geht die Simulation von einem gedrückten Taster aus!
Aus dem Grunde bekommt unser Flag eine EINS und das Programm wartet nun (BITWAIT), dass wir den Taster wieder virtuell loslassen.
Simulator_start.gif

Wenn du genau hingesehen hast, solltest du dich jetzt fragen, warum steht in der Speicherzelle 0061 (für unser FLAG) jetzt eine 80 und keine 01 ???

Das liegt daran, dass im Speicher das niedrigste Bit (LSB genannt) zu erst abgespeichert wird.
Eine hexadezimale 80 ist binär nämlich: 1000_0000
Eine 1 ist binär: 0000_0001 (siehe blaue Umrahmung im gelben Variablenfenster)
Wenn du die binäre 1 nun "rückwärts" einliest, kommt die angezeigte hexadezimale 80 heraus! :wink:


Jetzt aber weiter mit dem Programm....
Wenn du jetzt den Eingang IC.0 aktivierst (bedeutet: Taster losgelassen), so dass die "LED" leuchtet, rennt das Programm auch gleich weiter.
Simulator_Taster.gif
Du kannst dabei im gelben Variablen-Fenster und im Memory-Fenster (Zelle 0060) verfolgen, wie die Variable I von 1 bis 4 hochgezählt wird!


Da unser virtueller Taster nicht wieder gedrückt wurde.... IC.0 ist damit HIGH und leuchtet grün ....wird die ELSE-Anweisung der Befehlsebene ausgeführt.
In der ELSE-Anweisung steht drin....
Code:
'Befehlsebene-----------------------
If Taster1 = 0 Then                                         'Wenn der Taster gedrückt ist dann....
   Led_8 = Aus                                              'LED 1 ausschalten
   Toggle Flag                                              '"Umschalten" des Flags, 1 oder 0
   Bitwait Taster1 , Set                                    'Warte, bis der Taster wieder losgelassen wurde
[COLOR="#FF0000"]Else
   Led_8 = Ein                                              'LED 1 einschalten[/COLOR]
End If

....das der Ausgang PORTD.7 (für LED_8) HIGH sein soll.... und damit die LED leuchtet.
Dies wird ebenfalls im Simulator angezeigt.
Die rote "LED" bei PD.7 leuchtet nun ebenfalls!
Simulator_Schleife.gif



Das war es dann auch schon, mit dem virtuellen Einblick in den Corntroller.
Du kannst damit ja noch etwas rumspielen, um dich mit dem Simulator vertraut zu machen.
Er ersetzt zwar keinen echten Hardwareaufbau, aber manchmal ist er doch recht hilfreich. :wink:

Viele Grüße,
Cassio
 
Nun wirds noch interessanter!

Hallo Jordy,

wollte Dir heute vormittag antworten über meine Lernfortschritte. Aber ich wollte Deine Abschnitte anhand des BASCOM-AVR Programmes
vergleichen. Zu diesem Zweck habe ich es ausgedruckt. Dabei habe ich die Printerfunktionen nach meinen Erfordernissen geändert. Das
ging auch nicht so schnell. Aber nun sind die Ausdrucke wie gewünscht. Durch probieren und nach einigen Ausdrucken war es soweit!
Damit kann ich bequem Deine Einfügungen durchlernen. Ein Blick auf den Screen, dann mit dem Ausdruck vergleichen. Eventuell in der
Hilfe nochmals den Begriff aufrufen. Und ab und zu das Online-Wörterbuch öffnen. Sind schon 3 Fenster.

Bin heute noch nicht dazu gekommen Prog2 und Prog4 genau nachzuvollziehen!

Und nun die schon die nächste Lektion mit der Simulation. Das habe ich bisher noch nie geöffnet. Scheint eine super Sache zu sein!
Aber bitte warte ein paar Tage, ich habe heute nicht mehr viel Zeit. Morgen bin ich auch ganztags verhindert.

Das ist eine super Hilfe von Dir!
Danke!


Will Dir gleich antworten, wenn ich soweit bin!
Gruß Jordy
 
Hallo Jordy!

Mach dir keinen Stress !

Die nächsten Tage habe ich auch noch anderes zu erledigen und dann kannst du dich in Ruhe mit den letzten Beiträgen befassen.
Vielleicht entdeckst du ja inzwischen auch Paralleln und/oder Ergänzungen zu meinen Beispielen in deinem Buch.

Durch meine letzten beiden Beiträge sollte dir die Funktionsweise des Simulators auch verständlicher geworden sein.
Du kannst also durchaus auch einige Beispielprogramme nur mal im Simulator ausprobieren....


Viel Spaß weiterhin,
Cassio
 
Hallo Cassio,
wie kann ich im "Testprogramm-3" der Led_8 einen Timer zuweisen?
Genauer gesagt, soll es diese diese PWM sein.
Code:
Config Timer0 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Timer0
Enable Interrupts

Dim Fla As Byte
Dim Pause As Byte

Do
    Fla = Rnd(200)
    Fla = Fla + 55
    Pwm0a = Fla
    Waitms Pause
    Pwm0b = 255 - Fla

    Pause = Rnd(10)
    Pause = Pause * 25
    Waitms Pause
Loop
End
 
Hmm…
Testprogramm-3 scheint das aus Beitrag7 zu sein; der dort verwendete Controller ist ein Mega8. Hier mal das Datenblatt.

LED_8 ist im konkreten Programm nur ein Name (Stichwort "Alias") für ein Bein des Controllers (D7), genauer gesagt sogar für dessen Port-Register Bit (das legt den logischen Pegel fest, wenn das Bein Ausgang (Stichwort "DDR") ist).

Der Mega8 hat jedenfalls drei Timer (Timer0 bis Timer2).

Timer0 (also dieser, der des Mega0) ist ein 8-Bit-Timer (ein Byte), kann also von 0..255 zählen und läuft dann über. Beim Überlauf wird automatisch ein Überlauf-Flag gesetzt, welches einen Interrupt auslösen kann.
Das ist die einfachste Timer-Variante der Atmel Controller. Timer0 besitzt kein Output-Compare-Unit, und kann selbständig kein PWM auf irgendwelchen Beinen erzeugen. Du könntest stattdessen lediglich die Überläufe des Timers nutzen, und selbst PWM in Software implementieren (also bei jedem Timer-Überlauf wird 'ne Variable inkrementiert und mit dem Sollwert der PWM verglichen, und dann ggf das LED-Bein gesetzt oder gelöscht. Software-PWM. Damit könntest Du beliebig viele PWM-Kanäle umsetzen - Nachteil der Software-Lösung ist, daß Dein Hauptprogramm bei jedem Timerüberlauf unterbrochen werden würde (also PWM-Frequenz * Auflösung viele Unterbrechungen pro Sekunde).

Timer2 (des Mega8) ziehe ich jetzt mal vor, das ist hier auch ein 8-Bit-Timer, der grundsätzlich auch wie Timer0 mit Überläufen von 0..255 zählen kann. Außerdem besitzt Timer2 zusätzlich ein Output Compare Unit, welches den Zähler des Timers bei jedem Schritt mit einem vorgegebenen Wert (Output Compare Register) vergleicht. Bei Gleichheit wird hier auch ein Flag gesetzt, welches auch einen Interrupt generieren könnte, Der Compare Match kann aber auch automatisch PWM erzeugen, und zwar (nur) auf dem fest angeschlossenem Output Compare Pin (Bein). Das wäre hier B3. Timer2 könnte also Hardware-PWM an B3 erzeugen, im Hintergrund ohne weitere Eingriffe/Unterbrechungen.
Natürlich kann man mit Timer2 bzw dessen Überläufen auch eine Software-PWM-Implementierung wie bei Timer0 angedeutet umsetzen, man kann aber hier auch den Output-Compare- und den Überlaufs-Interrupt nutzen Damit könntest Du ein (oder mehrere simultan oder alternierend) beliebiges Bein in einem der beiden IRQs setzen, und im anderen IRQ löschen lassen, und hättest nur noch (PWM-Frequenz * 2) Unterbrechungen pro Sekunde.

Timer1 ist ein 16bit-Timer, der allerdings auch als 8, 9 oder 10bit-Timer laufen könnte; Software-Lösungen gehen wie auch bei den anderen Timern. Timer1 besitzt sogar zwei Output-Compare-Units, kann also gleichzeitig auf zwei Kanälen Hardware-PWM. Die mit diesen beiden Units fest verdrahteten Beine sind B1 und B2.

Nachfolger des Mega8 ist übrigens der Mega88 (gibt's dann in unterschiedliche Speicherausstattungen als Mega48/88/168/328), da hat dann jeder der drei Timer zwei nutzbare, fest verdrahtete PWM-Beine.
Den 328 gibt's inzwischen auch als ATmega328PB, der hätte dann sogar 5 (fünf) Timer, je mit zwei Output-Compare-Units. Also theoretisch 10 fest verdrahtete PWM-Beine - allerdings liegen ein Unit von Timer3 und ein Unit von Timer4 auf ein und demselben Bein.

Es gibt aber auch Controller mit anderen Timern - zB welche mit drei Output-Compare-Units (ATtiny261/461/861...), oder welche, bei denen die OC-Units nicht mehr fest auf Beine verdrahtet sind, sondern über einen Multiplexer mehr oder weniger variabel verbunden werden können (ATtiny441/841).
 
Danke LotadaC,
das waren sehr viele Informationen über die Timer_Möglichkeiten.
So weit bin ich noch nicht in meinem Selbststudium.
Wie gesagt, habe ich hier Seite/Beitrag 1-9 nachvollzogen und wollte mit diesem Wissen selbst etwas zusammen stellen. Ich habe die If, Then, Else in Verbindung mit dem Taster und das Toggeln mit einem Flag verstanden. Die Anwendung eines Bestimmten Zeitraum mit For und Next kennen gelernt.
Ich hätte gern, wenn der Taster (wie im Beitrag oder Seite 9) gedrückt wird in der For-Next Anwendung eine Zeit abläuft, in der nicht nur die Led leuchtet sondern eine Kerzensimulation (wie ich es im Code Seite 17) darstellt.
Nach der abgelaufenen Zeit soll der Timer wieder aus gehen bzw. bei Tastendruck erneut starten.
Leider hab ich irgendwo etwas falsch gemacht. Die Led flackert zwar, aber sie geht nie ganz aus.
Code:
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64

Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
'Enable Timer1
'Enable Interrupts

'Pins am Port B konfigurieren
'Port-Bit-7654_3210
'         |||| ||||
Ddrb = &B_1111_1111
Portb = &B0000_0000

'Pins am Port C konfigurieren
Ddrc = &B_00_0000
Portc = &B11_1111

'Pins am Port D konfigurieren
Ddrd = &B_1111_1111
Portd = &B0000_0000

'Variablen, Konstanten, Alias erstellen
Rot Alias Portd.6

Taster Alias Pinc.0

Dim Z As Word
Dim Flag As Bit
Dim Fla As Byte
Dim Pause As Byte


'Programmschleife*******************

Do

'Befehlsebene-----------------------

If Taster = 0 Then
   Start Timer1
   Toggle Flag
Else
    Fla = Rnd(200)
    Fla = Fla + 55
    Pwm1a = Fla
    Waitms Pause
    Pwm1b = 255 - Fla

    Pause = Rnd(10)
    Pause = Pause * 25
    Waitms Pause
End If

'Executivebene----------------------

If Flag = 1 Then
   For Z = 1 To 5
      Rot = 1
      Waitms 100
      Rot = 0
      Wait 2
   Next Z
      Flag = 0
Else
   Stop Timer1
End If
Loop

'Programmschleife-Ende--------------
 
Leider hab ich irgendwo etwas falsch gemacht. Die Led flackert zwar, aber sie geht nie ganz aus.
Du hast aber drei LEDs: je eine an OC1A und OC1B (B1 und B2, da soll der Timer PWM mit draufmodulliertem flackern ausgeben) und eine an D6 (die nach einem Tastendruck in etwa(!) 10 Sekunden fünfmal aufblitzt (wenn sie gegen Gnd geschaltet ist).

Was heißt "nie ganz aus"? Die Blitz-LED sollte nach den fünf Strobes aus bleiben, was machen die PWM-LEDs nach den 10s? Flackern die da weiter, oder gehen die auf konstant "volle Helligkeit"?
Flackern die überhaupt, oder ändern die nach jedem Tastendruck nur mal kurz die Intensität, und halten den Wert dann für die 10s?

Du Startest und Stopst den Timer nur, der wird dann einfach von der Taktquelle abgekoppelt, und steht. Der Status der Output-Compare-Ausgänge ändert sich aber immer nur dann, wenn die Schwell-Werte (eben der zum An- und der zum Abschalten) überschritten werden. Salopp gesagt frierst Du mit Stop Timer nicht nur das Timer-Zählwerk ein, sondern auch den Zustand der dranhängenden Output Compare Units.

P.S.: Du hast Deinen Code in allgemeine Code-Tags gesetzt, sinniger wären hier Bascom-Code-Tags gewesen (Zeilennummern und Syntax Highlightning). Der "</>"-Button oben...
 
Ok, was macht:
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Es werden in folgenden drei Registern Bits gesetzt:
  • DDRB: &B00000110
  • TCCR1A: &B11110001
  • TCCR1B: &B00000011
Also:
  • B1 und B2 werden Ausgänge (11)
  • Waveform Generation Mode für Timer 1 wird WGM=&B0001
  • Compare Output Mode für beide Kanäle: COM1A[1..0]=&B11, COM1B[1..0]=&B11
  • Clock Select CS=&B011, das entspricht Prescaler=64
Also B1 und B2 sind Ausgänge, WGM=1 entspricht dem phasenkorrektem 8-Bit-PWM (der Timer läuft zwischen 0 und 255 hin und her).
Bei jedem Timer-Schritt wird der eigentliche Zähler mit den beiden Output Compare-Registern verglichen - bei einem Match wird das entsprechende Output-Bein manipuliert: beim Raufzählen wird das Bein gesetzt, beim runterzählen wird es gelöscht.
Der Timer läuft mit Prescaler=64, also 125kHz Schrittfrequenz los.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)