PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmschwierigkeiten vom Anfänger



blondie
19.07.2006, 13:56
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!!!

PicNick
19.07.2006, 14:48
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.

blondie
19.07.2006, 15:50
Hallo!
Die Schalter sind alle mit 10k Pulldown Widerständen versehen. Daran kann es nicht liegen....aber woran dann?

Danke für die Hilfen!!

Marco78
19.07.2006, 16:09
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.

blondie
21.07.2006, 20:10
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!!!!

blondie
21.07.2006, 20:30
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?

Marco78
21.07.2006, 22:26
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.

E-Fan
21.07.2006, 22:32
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 ;)

Marco78
21.07.2006, 22:33
$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)

E-Fan
21.07.2006, 22:37
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

Marco78
21.07.2006, 23:04
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!

blondie
22.07.2006, 08:39
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 :)

chr-mt
22.07.2006, 09:07
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

Marco78
22.07.2006, 09:35
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 ;)

blondie
22.07.2006, 10:34
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 ;)

Marco78
22.07.2006, 11:32
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.

blondie
23.07.2006, 10:08
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!!!