PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control Tastenabfrage in asm



xdr4g0n
15.09.2006, 12:39
Hallo,

Ich kann mir vorstellen, dass regelmäßig gefragt wird, wie die RN-Control Tasten abgefragt werden, leider hab ich wenig gefunden und aufgegeben zu suchen und zu probieren, obwohl ich doch schon etwas geschafft hab.



.include"m32def.inc"

.org 00
rjmp reset

reset:
ldi r16, 0b11000111

start:

sbi porta,7 ;Pullupwiederstand, wie im Bsp. Program von der CD
cbi ddra,7 ;PortA als Eingang
out adcsra, r16 ;ADC starten

test:
sbic adcsra,6 ;warten bis ADC fertig
rjmp test

in r17,adcl ;ADC Ergebnis speichern
in r18,adch

rjmp start


Ich hab das was ich bis jetzt hab aus dem Datenblatt des RN-Controll, des Atmel M32 Datenblattes und einiger Forenbeiträge zusammengesammelt. Es ist nicht viel, aber hier verstehe ich ein paar sachen nicht.

Im Basic Bsp. Programm für das RN-Control wird der PortA.7 Auf High gesetzt, ich versteh nicht warum, schließlich ist der Port ja auf Eingang geschalten, und es liegt eh keine Spannung an.

Die Sache mit den Prescaler Selectbits hab ich auch nicht verstanden, was machen die und wie funktionieren die?

Und zum Schluss weiß ich nicht wie ich mit den Ergebnissen des AD-Wandlers weitermache um z.B. die LED's des Boards anzuschalten, wobei das anschalten nicht das Problem ist.

Ich hoffe die 3 Punkte sind schon die einzigen übrigen Probleme zur Tastenabfrage. Gibt es eigentlich kein Tutorial für das RN-Control und ASM?

Naja, ich hoffe ich gehe euch nicht mit einem Problem auf die Nerfen das schon 1000 ihr schon 1000 mal einen Anfänger erklärt habt und bedanke mich im Vorraus.

Hanni
15.09.2006, 13:02
Hallo,

Ich kann mir vorstellen, dass regelmäßig gefragt wird, wie die RN-Control Tasten abgefragt werden, leider hab ich wenig gefunden und aufgegeben zu suchen und zu probieren, obwohl ich doch schon etwas geschafft hab.



.include"m32def.inc"

.org 00
rjmp reset

reset:
ldi r16, 0b11000111

start:

sbi porta,7 ;Pullupwiederstand, wie im Bsp. Program von der CD
cbi ddra,7 ;PortA als Eingang
out adcsra, r16 ;ADC starten

test:
sbic adcsra,6 ;warten bis ADC fertig
rjmp test

in r17,adcl ;ADC Ergebnis speichern
in r18,adch

rjmp start


Ich hab das was ich bis jetzt hab aus dem Datenblatt des RN-Controll, des Atmel M32 Datenblattes und einiger Forenbeiträge zusammengesammelt. Es ist nicht viel, aber hier verstehe ich ein paar sachen nicht.

Im Basic Bsp. Programm für das RN-Control wird der PortA.7 Auf High gesetzt, ich versteh nicht warum, schließlich ist der Port ja auf Eingang geschalten, und es liegt eh keine Spannung an.

Die Sache mit den Prescaler Selectbits hab ich auch nicht verstanden, was machen die und wie funktionieren die?

Und zum Schluss weiß ich nicht wie ich mit den Ergebnissen des AD-Wandlers weitermache um z.B. die LED's des Boards anzuschalten, wobei das anschalten nicht das Problem ist.

Ich hoffe die 3 Punkte sind schon die einzigen übrigen Probleme zur Tastenabfrage. Gibt es eigentlich kein Tutorial für das RN-Control und ASM?


Nimm doch bitte das Datenblatt zur Hand. Dort steht unter anderem das folgende drin:

Das Port Register wird zum aktivieren / deaktivieren der internen Pullups genutzt, wenn der entsprechende Pin als Eingang konfiguriert ist.

Dann kann ich dir das Tutorial auf www.mikrocontroller.net ans Herz legen. Dort in der Codesammlung findest du auch so einige recht brauchbare Codeschnipsel.

So, das erst mal von mir dazu.

manu_f
17.11.2006, 11:38
hallo zusammen!

bitte nicht böse sein aber alleine schaff ichs nicht! :cry:
also da ich mich jetzt entschieden habe den avr (rn-control) in assembler zu programmieren und damit besser verstehen zu können, bräuchte ich etwas starthilfe.

ich möchte auch erst mal die tasten vom rn-control abfragen und dann eventl. für die taste1 die led1, taste2 die led2 usw leuchten lassen.

leider weiß ich nicht wirklich wie ich das anstellen soll.
habe zuerst einmal ein- und ausgänge definiert und den ADC eingestellt. jetzt weiß ich nicht wie man weiter vorgeht.
hier mal mein programm:


.NOLIST ; List-Output unterdrücken
.INCLUDE <m32def.inc> ; das gibt es für jeden Controllertyp
.LIST ; List-Output wieder aufdrehen
.CSEG ; was nun folgt, gehört in den FLASH-Speicher

.def w = r16
;------------------------------------------------------
; Start Adresse 0000
;------------------------------------------------------
RESET:
jmp INIT ; springen nach "INIT"

;------------------------------------------------------
; ISR VECTORS
;------------------------------------------------------
; ..... hier kommen dann die Sprungadressen für die Interrupts rein
; dazu kommen wir noch


.ORG INT_VECTORS_SIZE ; dadurch haben wir für die Vektoren Platz gelassen
INIT:
;------------------------------------------------------
; INITIALIZE
;------------------------------------------------------
ldi r24,high(RAMEND) ;Stack Pointer setzen
out SPH,r24 ; "RAMEND" ist in m32def.inc festgelegt
ldi r24,low(RAMEND) ;
out SPL,r24 ;

;------------------------------------------------------
; eigene Initialisierungen
;------------------------------------------------------
ldi w, 0x00
out DDRA, w ; PortA als Eingang
sbi PORTA,7 ; Pullup an Pin7 von PortA an
ldi w, 0xff
out DDRC, w ; PortC als Ausgang
ldi r17, 0b11000111 ; Einstellungen und Start für ADC
out ADCSRA, r17 ; ADC einstellen
ldi r17, 0b01100000 ; Referenzspannung Vcc einstellen
;....
;....

;------------------------------------------------------
; HAUPTSCHLEIFE
;------------------------------------------------------
start:
test:
sbic ADCSRA,6 ;warten bis ADC fertig
rjmp test ; immer wiederholen

in r18,adcl ;ADC Ergebnis speichern
in r19,adch

rjmp start
;------------------------------------------------------
; ENDE
;------------------------------------------------------
Ende:
rjmp Ende


wäre toll wenn mir jemand unter die arme greifen könnte! :)
oder gibts für die tastenabfrage irgendwo sowas wie eine musterlösung an die ich mir orientieren könnte?

viele grüße
manu

JonnyP
19.11.2006, 18:49
Vergiss erst mal den ADC, den brauchst du für ein paar Tasten nicht. Port A Pin 7 hast du als Eingang mit Pull Up definiert. OK, dann kommt an diesen Pin ein Taster nach GND.
Port C hast du als Ausgang definiert. Häng mal von +5V einen Widerstand von ca. 220 Ohm an die Anode einer LED und die Kathode an Port C7.
Dann schreibst du eine Schleife etwa so:
LOOP: IN R20, PINA
OUT PORTC, R20
RJMP LOOP

Du liest die Inputs von Pina nach r20 und gibst sie an Portc aus. Die Werte sind immer 1, also tut sich nichts. Drückst du jetzt aber die Taste am Pina7, dann wird dieser Pin auf GND (0) gezogen und diese 0 auf dem Portc7 ausgegeben und die LED leuchtet.

izaseba
19.11.2006, 19:08
Ein Tip:



ldi r17, 0b11000111 ; Einstellungen und Start für ADC
out ADCSRA, r17 ; ADC einstellen
ldi r17, 0b01100000 ; Referenzspannung Vcc einstellen


Lass es sein mit den Bitmasken, so kann es kein Mensch lesen und ich persönlich weigere mich extra im Dattenblatt nachzuschauen, was Du da einstellst.
Man muß im Assembler nicht so kompliziert denken !

Einfacher ist es z.B.


ldi tmp,(1<<PD0)|(1<<PD1)|(1<<PD2)
out PORTD,tmp


Am sonsten kannst Du Dir Deine ADC Werte über UART ausgeben lassen,
damit weißt Du schonmal welcher Wert in etwa für welche Taste zuständig ist.

Schau mal
hier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10101&highlight=asuro+tasten)

Ich hab da sowas für den Asuro geschrieben, müßte sich ziemlich einfach für RN-Controll umschreiben lassen

Gruß Sebastian