Hi
Du musst nicht zwingend einen Interrupt benutzen um auf einen Taster zu
reagieren.
Hast du schon mal im Datenblatt des PICs im Kapitel "I/O-Ports" etwas
nachgelesen? Dort steht eine beschreibung der TRIS und PORT register.
Dort siehst du den Aufbau des TRIS-Registers. und darunter steht:
1 | 1 = PORTA pin configured as an input (tri-stated)
|
2 | 0 = PORTA pin configured as an output
|
Also... wenn du jetzt zb den Wert "0b0000 1111"(0x0F) in das
TRISA-Register schreibst, dann ist des höherwertige Nibble(RA4 - RA7)
als Ausgang und das niederwertige Nibble(RA0-RA3) als Eingang
geschalten.
Sagen wir einmal an RA0 ist ein Taster( beim Betätigen wird geht er auf
0) und an RA1 ist eine LED( bei 1 Leuchtet sie). Dann musst du
folgendes machen:
1 | TRISA = 0x01; // TRISA0 wird auf 1 gesetzt->RA0 = input, other output
|
2 | while(1){
|
3 | while( !(PORTA && 0x01) )
|
4 | {
|
5 | //Hier liest du den PORTA ein und maskierst in
|
6 | //mit 0x01... damit erhältst du genau das Bit0
|
7 | //des PORTA-Resgister-- sprich den Zustand an RA0
|
8 | //Da aber der Taster 0 zurückgibt wenn er betätig wird, musst du halt
|
9 | // das ergebnis invertieren
|
10 | PORTA = 0x02;
|
11 | //eventuell gehört hier nich eine kleine Pause hinein->read-modify-write
|
12 | }
|
13 | PORTA=0;
|
14 | }
|
Soderla... normal sollte das funktionieren... getestet hab ichs aber
nicht ;-)
Aja.. damit das Funktioniert, musst du das PORTA und das TRISA-Register
zuerst definieren:
1 | #byte TRISA = 0x85
|
2 | #byte PORTA = 0x05
|
3 | #bit RA0 = PORTA.0
|
4 | #bit RA1 = PORTA.1
|
Mit den Letzten 2 Zeilen kannst du dan Bitweise zugreifen. Dann würde
der Code wie folgt aussehen:
1 | TRISA = 0x01; // TRISA0 wird auf 1 gesetzt->RA0 = input, other output
|
2 | while(1){
|
3 | while( !(RA0) )
|
4 | {
|
5 | RA1 =1;
|
6 | //eventuell gehört hier nich eine kleine Pause hinein->read-modify-write
|
7 | }
|
8 | PORTA=0;
|
9 | }
|
mfg Schoasch