Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmschwierigkeiten vom Anfänger
Hallo!
Ich habe gerade das Tutorial für die Basic Programmierung gelesen und auch einige versuche gemacht. Ich bin noch neuling in sachen Programmierung und bin dabei einige Programmiersprachen auszuprobieren um festzustellen welche für mich am besten geeignet ist.
Ich habe den Beispielcode etwas abgeändert:
'################################################# ##
'step3.bas.BAS
'für
'RoboterNetz.de AVR Tutorial in RN-Wissen
'
'Autor: Frank Brall
'Weitere Beispiele und Beschreibung der Hardware
'unter
' http://www.Roboternetz.de oder
' http://www.Roboternetz.de/wissen
'################################################# ######
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
Config Portb.7 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.7 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.6 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.6 = Input 'Ein Pin (PA0) wird als Eingang definiert
Do
If Pina.7 = 1 Then
Portb.7 = 1
Waitms 100
Portb.7 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.7 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.6 = 1 Then
Portb.6 = 1
Waitms 100
Portb.6 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.6 = 0 'Pin wird auf Low, also 0V geschaltet
End If
Loop
End
Die beschaltung des Atmega16 sieht bei mir so aus:
PA0-PA7 Schalter (Ich gebe mit den Schaltern einen 5V Pegel auf die Eingänge.
PB0-PB7 Ausgänge (LED´s mit Widerstand gegen Masse)
Die Schaltung sollte eigentlich bezwecken, das der Ausgang PB7 Blinken soll, wenn ich den eingang PA7 auf High gesetzt habe und PB6 Blinken soll wenn ich den Eingang PA6 auf High gesetzt hab.
Es ist jedoch egal welchen Eingang ich auf High setzte (auch z.B. bei PA0) fangen beide an zu blinken.
Habe ich mir den Code zu einfach vorgestellt? (Ich kenne Basic nur noch aus der guten alten C64 Zeit 8-[ )
Danke für eure Hilfe!!!
Der Code is eigentlich ok. Wie ist das mit den Schaltern ?
Pina.6 u. Pina.7 sollten immer eindeutig auf +5 oder GND liegen.
d.h. wenn du auf +5 schaltest, mußt du sie mit ~10k mit GND verbinden (Pulldown), damit sie bei offenem Schalter wissen, was läuft.
Hallo!
Die Schalter sind alle mit 10k Pulldown Widerständen versehen. Daran kann es nicht liegen....aber woran dann?
Danke für die Hilfen!!
Das hört sich wirklich eher nach einem Hardwarefehler an.
Versuch es doch lieber mal mit den internen Pullups und Schalter gegen Masse geschaltet.
http://www.rowalt.de/mc/index.htm <--- Die Seite hilft dir sicherlich weiter dazu.
Hallo!
War tatsächlich ein Hardwarefehler...ich hatte das Widerstandsnetzwerk für Pulldown falsch eingelötet ](*,)
Jetzt läuft das Programm tadellos!!!!
Danke für die Hilfe!!!!
Nochmal....
Hier mal das erweitere Programm...vielleicht interessiert es ja mal jemanden...
'################################################# ##
'step3.bas.BAS
'für
'RoboterNetz.de AVR Tutorial in RN-Wissen
'
'Autor: Frank Brall
'Weitere Beispiele und Beschreibung der Hardware
'unter
' http://www.Roboternetz.de oder
' http://www.Roboternetz.de/wissen
'################################################# ######
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
Config Portb.7 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.7 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.6 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.6 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.5 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.5 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.4 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.4 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.3 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.3 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.2 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.2 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.1 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.1 = Input 'Ein Pin (PA0) wird als Eingang definiert
Config Portb.0 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Config Pina.0 = Input 'Ein Pin (PA0) wird als Eingang definiert
Do
If Pina.7 = 1 Then
Portb.7 = 1
Waitms 100
Portb.7 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.7 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.6 = 1 Then
Portb.6 = 1
Waitms 100
Portb.6 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.6 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.5 = 1 Then
Portb.5 = 1
Waitms 100
Portb.5 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.5 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.4 = 1 Then
Portb.4 = 1
Waitms 100
Portb.4 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.4 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.3 = 1 Then
Portb.3 = 1
Waitms 100
Portb.3 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.3 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.2 = 1 Then
Portb.2 = 1
Waitms 100
Portb.2 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.2 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.1 = 1 Then
Portb.1 = 1
Waitms 100
Portb.1 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.1 = 0 'Pin wird auf Low, also 0V geschaltet
End If
If Pina.0 = 1 Then
Portb.0 = 1
Waitms 100
Portb.0 = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100
'Pin wird auf High, also 5V geschaltet
Else
Portb.0 = 0 'Pin wird auf Low, also 0V geschaltet
End If
Loop
End
Hierbei lässt sich schön erkennen, wie der Microcontroller das Programm der Reihe nach abarbeitet. Aber wie könnte ich das Programm ändern damit alle gleichzeitig aufblinken?
Do 'Anfang der Schleife
Portb = Pina 'Alles was an Pina ne 1 hat bekommt an B auch ne 1
waitms 100 'Gedenkminute
Portb=0 'Alle weider aus. Zum einen wegen blinken zum anderen sowieso, falls der Schalter aus ist.
waitms 100 'sonst würden alle sofort wieder eingeschaltet werden.
Loop 'play it again
Probier das mal aus. Ich hab's nicht getestet, könnte aber klappen.
Kleine Anmerkung zur Portkonfiguration:
Du kannst die Ports insgesamt mit "Config Portx = Input" /// "Config Porty = Output" als Ein- oder Ausgang definieren.
Sollen an einem Port einige Pin's als Eingang und einige als Ausgang definiert werden sähe das dann so aus.
Config Portx = &B11110000
Hier sind Pin 0 bis 3 als Eingang und Pin 4 bis 7 als Ausgang geschaltet.
Deine Variante geht freilich auch, erzeugt aber etwas mehr Schreibarbeit. Ob es mehr Code erzeugt entzieht sich meiner Kenntniss ;)
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
Config Pina = Input
Config Portb = Output
Do
Portb = Pina
Waitms 100
Portb=0
Waitms 100
Loop
End
So sieht's besser aus ;)
@E-Fan: Der Code wird nicht größer, wenn man jeden Pin einzeln einstellt. Bascom "rechnet" alles zusammen.
(Nur so am Rande, damit die Frage nicht offen stehen bleibt)
Meinste das klappt mit Portb=Pina? - denke eher das Pinb.x=Pina.x eher klappen würde. Ansonsten versucht man ja ein ganzes Byte in ein Bit reinzuschreiben. ;) - oder hab ich nen Hitzekoller? :D
Ich habe es schon gesehen, das ein ganzer Port ausgelesen wurde und auch ein Port komplet beschrieben wurde.
Ich denke schon das es klappt. Oder ich hoffe es.
Aber es wird ja ein Byte gelesen und ein Byte geschrieben. Ein Byte in ein Bit wäre ja Portb.0 = Pina
Portb.0 = Pina.0
Portb.1 = Pina.1 usw hatte ich zuerst geschrieben. Beim Schreiben kam mir der Gedanke, das es so evtl auch geht.
Wenn es so klappen sollte, wäre das wahrscheinlich sogar noch Code/Zeit sparender, weil nicht 8 einzelne Bits geschrieben werden müssen.
Ich bin sehr auf das Feedback gespannt!
Hallo!
Ich habe mal ein wenig getestet....
Bei dem Code von Marco78 kommt es beim Compilieren zu einer Fehlermeldung (unknown Config Parameter) und zwar genau an dieser stelle:
Config Pina = Input
Dan´n habe ich es mal so probiert:
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
Config Pina = Input
Config Portb = Output
Do
Portb.0 = Pina.0
Portb.1 = Pina.1
Portb.2 = Pina.2
Portb.3 = Pina.3
Portb.4 = Pina.4
Portb.5 = Pina.5
Portb.6 = Pina.6
Portb.7 = Pina.7
Waitms 100
Portb = 0
Waitms 100
Loop
End
Dann habe ich eine fehlermeldung "unknown config parameter" in der Zeile: "Portb.0 = Pina.0".
Das Verstehe ich jetzt nicht so ganz...
Übrigens...als blutiger Anfänger schreibe ich mir den ganzen Code lieber erstmal vollständig auf...dann kann ich nachvollziehen was ich da wirkllich programmiert hab...das Programmieren dann optimieren kann ich ja immer noch :)
Hi
config Pina geht nicht
es heißt immer config Portx für einen gesamten Port
Also config Porta = Input
Oder config Porta = Output
Einen einzelnen Pin kann man dann so konfigurieren
Config Pina.1=input
Config Pina.1=Output
Gruß
Christopher
Ja, das mit dem Config von mir war falsch :(
War gestern doch schon zu spät.
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
Config Porta = Input
Config Portb = Output
Do
Portb = Pina
Waitms 100
Portb=0
Waitms 100
Loop
End
Akzeptiert Bascom bei mir ohne Fehlermeldung.
Was die Hardware macht, kann ich leider nicht testen.
Du kannst es ja so erstmal ausprobieren und dann nochmal so programmieren wie du es gemacht hättest.
PS: Der Fehler mit Config wäre dir aber auch aufgefallen, wenn du den von mir empfohlenen Link mal angeschaut hättest ;)
Hallo!
War wohl doch noch etwas zu früh heute :)
So klappt es tatsächlich! Auch Hardwaremäßig. Ich möchte trotzdem meine eigentliche Frage noch etwas erweitern...
Ich kenne das z.B. von SPS steuerungen (Ich weiß man kann das nicht vergleichen) das ein Programm erst eingelesen wird und am ende des Programms werden die Ausgänge geschaltet. Danach wiederholt sich das Programm.
Ich habe hier ja das Problem, wenn ich z.B. eine Wartezeit von 10s habe, das ich den ganzen Controller diese 10s "stilllege". Gibt es da eine möglichkeit dieses zu umgehen?
Ich hoffe ihr versteht was ich meine....
P.S: Ich glaube Basic ist wirklich die beste Programmiersprache für mich...ich werde mir wohl demnächst auch mal ein geeignetes Buch darüber bestellen ;)
Der Code, so wie ich ihn geschrieben habe geht? Auch das Portb=Pina?
Das Problem mit Wartezeiten ist nicht so einfach zu lösen.
SPS kenne ich noch aus der Berufsschule, aber das ist zum einen schon ein paar Jahre her und zum anderen waren die Teile damals schon alt :( Eine S7 kenne ich nur von Bilder oder wenn mal eine in nem Schaltschrank ist.
Aber wo ist der Unterschied ob das Programm erst eingelesen wird und am Ende die Ausgänge gesetzt werden zu die Ausgänge werden dann gesetzt wenn es grade nötig ist?
Wenn die SPS warten muss, wartet sie doch auch nur, oder? Und das erst eingelesene Programm muss auch erst schauen, welche Bedinungen erfüllt sind um Ausgänge zu setzen.
Um in den Wartezeiten trotzdem arbeiten zu können, gibt es die Möglichkeit Interrupts zu nutzen.
Während der Wartezeit kann der RS232-Port abgefragt werden. Wenn Daten empfangen wurden, kann auf diese Reagiert werden, obwohl der Rest des Programm noch "wartet".
Oder ein Taster an einem externen Interrupt (INT0, INT1). Wird der Taster während der Wartezeit betätigt, wird das warten in den Hintergrund gestellt und es wird geschaut, was passieren soll, wenn der Taster gedrückt wird.
Oder das einlesen von ADC-Werten. Wenn dauerhaft was gemessen werden muss, kann nach Ende der Wandlung der Wert verarbeitet werden.
Diese Variante ist aber weniger sinnvoll, weil eine Wandlung zu schnell abgeschlossen ist. Der AVR ist dann die meiste Zeit damit beschäftigt die Werte zu verarbeiten.
Wenn man dann noch die Takte für das sichern der Register bedenkt, könnte das Hauptprogramm ins stocken kommen. Aber möglich wäre es und ist ggf. auch mal von nöten.
Eine weitere Variante ist das einsetzen von Timern.
Damit lässt sich viel machen.
Ein Timer löst nach einer eingestellten Zeit aus und unterbricht das Programm und damit das warten. So wäre es z.B. möglich jede Sekunde einen ADC-Wert zu messen, auch wenn das Hauptprogramm noch 9 Sekunden warten will.
Aber auch andere Sachen würden sich in der ISR des Timer erledigen lassen.
Komplizierter wird es, wenn das Programm nahzu multitaskfähig werden soll wie man es vom PC her kennt. (Wobei ein PC auch nur einen Schritt nach dem anderen abarbeiten kann!!!)
Der Timer könnte auch jede Sekunde auslösen und eine Variable hochzählen. Im Hauptprogramm kann man dann schauen, ob die 10 Sekunden schon abgelaufen sind und sich dann der nächsten Aufgabe zuwenden.
Sind die 10 Sekunden noch nicht abgelaufen, können erstmal andere Sachen gemacht werden.
Schau dir wirklich mal die Seite von Roland Walter an. Für den Einstieg ist die sehr gut!
Zum Thema Multitasking und AVRs findest du im Internet auch ein paar Infos.
Hallo!
Danke für die wirklich ausführliche Antwort!
Damit ist mir echt gut geholfen! Dann kann ich das bei meinen ersten Programmversuchen mit berücksichtigen.
Der Code hat einwandfrei funktioniert (auch Portb=Pina).
Danke für die ganzen Hilfen!!!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.