niklas90
13.12.2008, 21:25
Hallo,
Das Thema Microcontroller hat mich fasziniert, vor allem weil ich mich schon lange mit Elektronik beschäftige. Also habe ich mir ein paar Attiny12 bestellt, die entsprechende Software geladen und ein ISP-Dongle gelötet. Mit Wavrasm erstell ich mir den Assemblerquelltext und mit PonyProg2000 programmier ich den Chip. Das funktioniert auch wunderbar; habe mir zum Anfang ein kleines Lauflicht geschrieben. Nun wollte ich aber eine Tastenabfrage realisieren, jedoch komme ich da nicht weiter. Ich habe da ein generelles Problem in dem Zusammenhang entdeckt: Diese Befehle um Bits in Registern oder Ports zu vergleichen funktionieren scheinbar nicht, zumindest passiert da immer nichts. Also z.B. SBRC, SBIS, SBI. Wahrscheinlich benutze ich sie aber nur falsch.
Jedenfalls, mein erster Ansatz für die Abfrage wäre die (Die LED zum Anzeigen sitz auf Pin5 (PB0) und ich die Abfrage soll auf Pin6 (PB1) geschehen):
.include "C:\avrtools\appnotes\8515def.inc"
.def Temp = R19
.org 0
rjmp RESET
RESET:
ldi Temp, 1
out DDRB, Temp
CBI PORTB, 1
Main:
SBIC PINB, 2
SBI PORTB, 1
rjmp Main
Ich dachte halt, dass man die Bits direkt abfragen kann, bzw. ausgeben. Naja, bei meinen ersten Versuchen habe ich das aber auch nicht gemacht, mich wundert bloß, wie das funktioniere soll mit den Bits. dann habe ich noch ein "realistischeres" Programm geschrieben, das auch ganz gut geht, nur muss man extern einen Widerstand an den Eingabe-Pin nach Plus setzen. (Wie setzt man die internen???)
.include "C:\avrtools\appnotes\8515def.inc"
.def Rein = R20
.def Temp = R19
.org 0
rjmp RESET
RESET:
ldi Temp, 1
out DDRB, Temp
ldi R21, 2
Main:
ldi Temp, 1
IN Rein, PINB
CPSE Rein, R21
ldi Temp, 0
out PORTB, Temp
rjmp Main
Eigentlich wollte ich ja vermeiden mit Assembler zu programmieren, da ich schon ein paar Hochsprachen kann, aber weder Bascom noch WinAVR haben bei mir funktioniert. Bascom wollte nix compilieren, egal was ich geschrieben hab - außerdem hat der Attiny12 keinen Ram - und WinAVR hat nie das gemacht was es sollte, obwohl ich alles zu 100% nach den Anleitungen im Netz gemacht habe. Außerdem war mir die Sache mit dem Makefile zu stressig.
Wie dem auch sei, ich würde gerne wissen wie man solch eine Eingabe besser macht, also ohne widerstand und wie das mit den Bits funktioniert, ich hoffe ihr könnt mir helfen.
BTW: wieso schreiben alle immer die Zahlen in Hexadezimal- oder Binärform?? (0x02, 0b00000020, statt einfach 2 ;-)) der Compiler macht doch eh alles zu hex. Ich habe den Test gemacht: kein Unterschied!
Das Thema Microcontroller hat mich fasziniert, vor allem weil ich mich schon lange mit Elektronik beschäftige. Also habe ich mir ein paar Attiny12 bestellt, die entsprechende Software geladen und ein ISP-Dongle gelötet. Mit Wavrasm erstell ich mir den Assemblerquelltext und mit PonyProg2000 programmier ich den Chip. Das funktioniert auch wunderbar; habe mir zum Anfang ein kleines Lauflicht geschrieben. Nun wollte ich aber eine Tastenabfrage realisieren, jedoch komme ich da nicht weiter. Ich habe da ein generelles Problem in dem Zusammenhang entdeckt: Diese Befehle um Bits in Registern oder Ports zu vergleichen funktionieren scheinbar nicht, zumindest passiert da immer nichts. Also z.B. SBRC, SBIS, SBI. Wahrscheinlich benutze ich sie aber nur falsch.
Jedenfalls, mein erster Ansatz für die Abfrage wäre die (Die LED zum Anzeigen sitz auf Pin5 (PB0) und ich die Abfrage soll auf Pin6 (PB1) geschehen):
.include "C:\avrtools\appnotes\8515def.inc"
.def Temp = R19
.org 0
rjmp RESET
RESET:
ldi Temp, 1
out DDRB, Temp
CBI PORTB, 1
Main:
SBIC PINB, 2
SBI PORTB, 1
rjmp Main
Ich dachte halt, dass man die Bits direkt abfragen kann, bzw. ausgeben. Naja, bei meinen ersten Versuchen habe ich das aber auch nicht gemacht, mich wundert bloß, wie das funktioniere soll mit den Bits. dann habe ich noch ein "realistischeres" Programm geschrieben, das auch ganz gut geht, nur muss man extern einen Widerstand an den Eingabe-Pin nach Plus setzen. (Wie setzt man die internen???)
.include "C:\avrtools\appnotes\8515def.inc"
.def Rein = R20
.def Temp = R19
.org 0
rjmp RESET
RESET:
ldi Temp, 1
out DDRB, Temp
ldi R21, 2
Main:
ldi Temp, 1
IN Rein, PINB
CPSE Rein, R21
ldi Temp, 0
out PORTB, Temp
rjmp Main
Eigentlich wollte ich ja vermeiden mit Assembler zu programmieren, da ich schon ein paar Hochsprachen kann, aber weder Bascom noch WinAVR haben bei mir funktioniert. Bascom wollte nix compilieren, egal was ich geschrieben hab - außerdem hat der Attiny12 keinen Ram - und WinAVR hat nie das gemacht was es sollte, obwohl ich alles zu 100% nach den Anleitungen im Netz gemacht habe. Außerdem war mir die Sache mit dem Makefile zu stressig.
Wie dem auch sei, ich würde gerne wissen wie man solch eine Eingabe besser macht, also ohne widerstand und wie das mit den Bits funktioniert, ich hoffe ihr könnt mir helfen.
BTW: wieso schreiben alle immer die Zahlen in Hexadezimal- oder Binärform?? (0x02, 0b00000020, statt einfach 2 ;-)) der Compiler macht doch eh alles zu hex. Ich habe den Test gemacht: kein Unterschied!