Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control Tastenabfrage in asm
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.
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.
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
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.
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.