Dit is mijn eerste post over een project met een Microcontroller dus probeer het zo uitgebreid mogelijk te doen.
Voor een schoolproject zijn we bezig met een rotordisplay. Voor diegene die niet weten waar ik het over heb. Dit is een scherm dat opgebouwd is uit een enkele rij leds die als je deze zeer snel roteerd een beeld kunnen vormen.
Nu ben ik al een behoorlijke tijd bezig met het programmeren van de MicroChip (16F877a) en heb het programma gedeeltelijk werkend. Alleen loop ik tegen 2 problemen aan en kom er niet uit met de informatie die ik op internet kan vinden.
Het eerste probleem.
We hebben afgesproken met het team dat de woord lengte maximaal 10 is. Nu heb ik dus met behulp van de FSR en INDF functies een stukje code in elkaar gezet dat naar mijn mening
zou moeten werken.
Echter als ik nu het programma draai dan komt er op de uitgang de code te staan die in de INDF staat. Dit gebeurt als mijn selectie diagram een waarde krijgt die hij niet herkend. De waade die ik dus krijg is 0x00. Dit omdat ik in het begin van het programma de geheugenplaatsen clear (wat dus wel goed werkt
).
Mijn vraag
Moet er nog meer ingesteld worden om de INDF functie te gebruiken(lezen)?
Mijn 2e probleem
Ik krijg de interrupts niet goed aan het werk.
We detecteren met een lichtsluis of de roterende arm langs een vast punt komt. Echter als ik nu de code overneem zoals ik die op andere sites tegenkom dan reageerd de chip er totaal niet op.
In het begin van het programma staat dus ook zoals aangegeven in de DataSheet
ORG 0x00
GOTO MAIN
ORG 0x04
GOTO ISR
En de Interrupt ziet er als volgt uit
De waarde poort wordt door beide delen (Programma bestaat uit 2 hoofd gedeeltes)
verandert. De ene Cleart en de andere zet er 0xFF in.
Voor diegene die zeggen ik wil graag de hele code hebben dan kun je Hier klikken.
en als je intresse hebt in mijn alfabet of je afvraagt hoe heeft hij dat nou weer gedaan dan kun je Hier klikken Let wel op ik stuur de leds geinverteerd aan (0=aan 1=uit).
Voor een schoolproject zijn we bezig met een rotordisplay. Voor diegene die niet weten waar ik het over heb. Dit is een scherm dat opgebouwd is uit een enkele rij leds die als je deze zeer snel roteerd een beeld kunnen vormen.
Nu ben ik al een behoorlijke tijd bezig met het programmeren van de MicroChip (16F877a) en heb het programma gedeeltelijk werkend. Alleen loop ik tegen 2 problemen aan en kom er niet uit met de informatie die ik op internet kan vinden.
Het eerste probleem.
We hebben afgesproken met het team dat de woord lengte maximaal 10 is. Nu heb ik dus met behulp van de FSR en INDF functies een stukje code in elkaar gezet dat naar mijn mening
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| letterladen MOVLW 0x21 ;eerste letter plaats initialiseren LET OP 21h wordt zelf niet gebruikt!!
MOVWF FSR
MOVLW 0x0A ;De hoeveeleid letters aangeven 0A = 10
MOVWF letteraantal
nieuweLetter1 INCF FSR, f
MOVF PORTC, w ;Staat er een nieuwe letter klaar?
MOVWF PORTD
SUBLW 0x9D
BTFSC STATUS, 2
GOTO Beginnieuweronde
MOVF PORTC, w
SUBLW 0xB8
BTFSS STATUS, 2 ;ja? dan gaan we deze ontvangen
GOTO nieuweLetter1
ontvangen1 MOVF PORTC, w ;Staat de nieuwe letter op de ontvangst pinnen?
SUBLW 0xB8
BTFSC STATUS, 2 ;nog niks verandert? dan loop-en we hem nog een keer
GOTO ontvangen1
MOVF PORTC, 0
MOVWF PORTD
MOVWF INDF ; De opgehaalde waarde opslaan in de adreswaarde die in FSR staat
DECFSZ letteraantal, f
GOTO nieuweLetter1 |
Echter als ik nu het programma draai dan komt er op de uitgang de code te staan die in de INDF staat. Dit gebeurt als mijn selectie diagram een waarde krijgt die hij niet herkend. De waade die ik dus krijg is 0x00. Dit omdat ik in het begin van het programma de geheugenplaatsen clear (wat dus wel goed werkt
Mijn vraag
Moet er nog meer ingesteld worden om de INDF functie te gebruiken(lezen)?
Mijn 2e probleem
Ik krijg de interrupts niet goed aan het werk.
We detecteren met een lichtsluis of de roterende arm langs een vast punt komt. Echter als ik nu de code overneem zoals ik die op andere sites tegenkom dan reageerd de chip er totaal niet op.
code:
1
2
3
4
5
6
7
| ;-----Interrupt instellingen---------------------------------------
BCF OPTION_REG, INTEDG ;Interrupt bij negatief
BSF OPTION_REG, NOT_RBPU
BCF INTCON, INTF ;Clear interrrupt vlag
BSF INTCON, INTE ;mask for external interrupts
BSF INTCON, GIE |
In het begin van het programma staat dus ook zoals aangegeven in de DataSheet
ORG 0x00
GOTO MAIN
ORG 0x04
GOTO ISR
En de Interrupt ziet er als volgt uit
code:
1
2
3
4
5
6
7
| ;----Interrupts----------------------------------
ISR BCF INTCON,INTF
BSF INTCON, GIE
BTFSS POORT, 0
GOTO pauzetelling
GOTO Beginnieuweronde |
De waarde poort wordt door beide delen (Programma bestaat uit 2 hoofd gedeeltes)
verandert. De ene Cleart en de andere zet er 0xFF in.
Voor diegene die zeggen ik wil graag de hele code hebben dan kun je Hier klikken.
en als je intresse hebt in mijn alfabet of je afvraagt hoe heeft hij dat nou weer gedaan dan kun je Hier klikken Let wel op ik stuur de leds geinverteerd aan (0=aan 1=uit).
[ Voor 4% gewijzigd door Steefph op 12-01-2005 19:44 ]
Alles is terug te redeneren naar 4