PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt an PortC PCInt8-PCInt14 des Mega48



Step
29.08.2006, 23:36
Hallo,

ich habe Schwierigkeiten die Interrupts des PortC abzufragen.
Ich muß auf PortC gehen, da ich PortB für PWM mit Timer 1 brauche.

Mit der Nutzung von PCInt0 an pcint0-pcint3 (portb.0-portb.3) hatte ich keine Probleme.

Trotz Listing von MCS komme ich aber nicht mit den "erweiterten" Interrupts der Mega48/88 und 168 klar.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13202&highlight=pcint

Hier mal mein fehlerhaftes Listing - die eigentliche Interrupt-Auswertung fehlt noch.



'BASISEINSTELLUNGEN:
' Port B ist teils für die PWM reserviert.
' Port C ist allgemein für den Interrupt reserviert (C0, C1 und C2).
' Port D ist allgemein Ausgang.

'Initialisierungen µC und Takt
$regfile = "m48def.dat" 'Definitionsdatei für den Mega48.
$crystal = 8000000 'Quarzfrequenz 8,0MHz.

'---------------------------------------------------------------------------
'Portbelegungen
Config Pinb.1 = Output 'Pin B1 (Pin 15) als PWM-Ausgang Timer1 konfiguriert.
Config Pinb.2 = Output 'Pin B2 (Pin 16) als PWM-Ausgang Timer1 konfiguriert.

Portc = &B11111111 'PullUp von allen Pins Port C aktivieren.
Ddrc = &B00000000 'Port C kpl. auf Eingang.

Portd = &B11100000 'PullUp von Pin PD5, PD6 und PD7 aktivieren.
Ddrd = &B11111111 'Port D kpl. auf Ausgang.

Config Portc = Input 'Der ganze Port C als Input deklariert.
Portb = &B11111111 'Der ganze Port C PullUp eingeschaltet > pcint0-pcint7 (portb.0-portb.7).

'---------------------------------------------------------------------------
'Interrupt-Deklaration
Enable Interrupts 'Global Interrupts erlauben.
Enable Pcint8 'Enable Interrupt Pcint8, Pin 23 (PC0).
Enable Pcint9 'Enable Interrupt Pcint9, Pin 24 (PC1).
Enable Pcint10 'Enable Interrupt Pcint10, Pin 25 (PC2).
On Pcint8 Taster 'Wenn an Pin C0 das Level wechselt, Sprung zu Label Taster.
Pcmsk1 = &B00000111 'Enable pcint8-pcint10 (portc.0-portc.2).

'---------------------------------------------------------------------------
'Variablen-Deklaration
Dim Pwmtv As Word 'Deklaration der PWM-Tastverhältnis-Variablen.
Dim Startwert As Word 'Deklaration der Startvariablen für die Nachführgeschwindigkeit.
Startwert = 1 'Vorbelegung des Startwertes wird aus EEPROM gelesen.

'---------------------------------------------------------------------------
'Timer/PWM-Einstellungen
'Timer 1 konfigurieren auf PWM-9 Bit Modus, somit 512 Schritte im PWM-Tastverhältnis.
'Durch Konfiguration auf Clear Down erhöht sich das PW-Tastverhältnis mit größerer Zahl > mehr Power.
'Der Prescaler kann nur 1, 8, 64, 256 oder 1024 sein.
'Die PWM-Ausgangsfrequenz ist = (Quarzfrequenz/Prescale ) /(Timerauflösung*2).
'Bei 8MHz, 9Bit Genauigkeit und Prescaler 8 also (8.000.000/8)/(512*2)=976,6Hz.
Config Timer1 = Pwm , Pwm = 9 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Compare1a = 511 'Voll Power an Pin B1 (Pin15) (0-511 bei 512 Stufen).
Compare1b = 256 'Power an Pin B2 (Pin 16) runtergedreht auf Tastverhältnis 50%.

'---------------------------------------------------------------------------
'Programm
Do
Portd.5 = Not Portd.5 'LED blinkt als Programmsimulation.
Waitms 30
Loop

End

Wäre Klasse wenn mir hier jemand konkret (bin Anfänger) weiterhelfen könnte!

Viele Dank!

Wolfram

linux_80
29.08.2006, 23:44
Hallo,

sowas ähnliches hatten wir doch erst vor ein paar Tagen,
( https://www.roboternetz.de/phpBB2/viewtopic.php?t=22681
dort hab ich schonmal versucht zu beschreiben wie das hinhaut)
die PinChange-Interrupts sind immer pro Byte zusammengefasst, es gibt da also nur 3 von der Sorte beim M48.
Man muss schauen welcher Port welchen IRQ auslöst, und dann dort das entsprechnde Pin checken, damit man weiss welches den IRQ ausgelöst hat.

Deshalb gibts das nicht:
Enable Pcint8

Step
30.08.2006, 01:27
Hallo,

sorry hast vollkommen recht...ich hab schon soooo viel gefragt, daß ich den Wald vor lauter Bäumen nicht mehr sehe.

Kapiert hab ich nun, daß für PortB PCInt1 zuständig ist.
Ist nun schon 2:00...ich mache nachher weiter!

Neeee..hab auch meinen Stolz.
Ich hab es Dank deiner Anmerkungen hinbekommen O:)

Hier das kpl. recht gut dokumentierte Listing.



' Compiler: Bascom 1.11.8.3
' Testboard: myAVR Board USB2.
' D5 an LED rot, D6 an LED gelb, D7 an LED grün.
' Taster 1 an C0, Taster 2 an C1.
'###############################################

'BASISEINSTELLUNGEN:
' Port B ist teils für die PWM von Timer 1 reserviert.
' Port C ist für den Interrupt PCInt1 reserviert (vorerst C0, C1 und C2).
' Port D ist allgemein Ausgang.

'Initialisierungen µC und Takt
$regfile = "m48def.dat" 'Definitionsdatei für den Mega48.
$crystal = 8000000 'Quarzfrequenz 8,0MHz.

'---------------------------------------------------------------------------
'Portbelegungen
Config Pinb.1 = Output 'Pin B1 (Pin 15) als PWM-Ausgang Timer1 konfiguriert.
Config Pinb.2 = Output 'Pin B2 (Pin 16) als PWM-Ausgang Timer1 konfiguriert.

Portc = &B11111111 'PullUp von allen Pins Port C aktivieren.
Ddrc = &B00000000 'Port C kpl. als Eingang deklariert.

Portd = &B11100000 'PullUp von Pin PD5, PD6 und PD7 aktivieren.
Ddrd = &B11111111 'Port D kpl. auf Ausgang deklariert.

Config Portc = Input 'Der ganze Port C als Input deklariert.
Portc = &B11111111 'Der ganze Port C PullUp eingeschaltet > pcint0-pcint7 (portb.0-portb.7).

'---------------------------------------------------------------------------
'Interrupt-Deklaration
Enable Interrupts 'Global Interrupts erlauben.
Enable Pcint1 'Enable Interrupts an Port C, Pin 1 und 23-28 (PC0-PC6).
Pcmsk1 = &B00000111 'Enable pcint8-pcint10 (portc.0-portc.2) zur Interrupt-Überwachung.
On Pcint1 Taster 'Wenn an PortC das Level wechselt, Sprung zu Label Taster.

'---------------------------------------------------------------------------
'Variablen-Deklaration
Dim Pwmtv As Word 'Deklaration der PWM-Tastverhältnis-Variablen.
Dim Startwert As Word 'Deklaration der Startvariablen für die Nachführgeschwindigkeit.
Startwert = 256 'Vorbelegung des Startwertes wird später aus EEPROM gelesen.

'---------------------------------------------------------------------------
'Timer/PWM-Einstellungen
'Timer 1 konfigurieren auf PWM-9 Bit Modus, somit 512 Schritte im PWM-Tastverhältnis.
'Durch Konfiguration auf Clear Down erhöht sich das PW-Tastverhältnis mit größerer Zahl > mehr Power.
'Der Prescaler kann nur 1, 8, 64, 256 oder 1024 sein.
'Die PWM-Ausgangsfrequenz ist = (Quarzfrequenz/Prescale ) /(Timerauflösung*2).
'Bei 8MHz, 9Bit Genauigkeit und Prescaler 8 also (8.000.000/8)/(512*2)=976,6Hz.
Config Timer1 = Pwm , Pwm = 9 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Compare1a = 511 'Voll Power an Pin B1 (Pin15) (0-511 bei 512 Stufen).
Compare1b = 256 'Power an Pin B2 (Pin 16) runtergedreht auf Tastverhältnis 50%.

'---------------------------------------------------------------------------
'Programm
Do
Portd.5 = Not Portd.5 'LED blinkt als Programmsimulation.
Waitms 30
Loop

'Sprungmarke Label Taster
Taster: 'Label Taster, Sprungmarke für Pcint0-Interrupt.
Waitms 20 'Taster entprellen
If Pinc.0 = 0 Then Portd.6 = Not Portd.6 'Gelbe LED (Pin PD6) an oder aus, wenn Taster 1 an Pin C0 gedrückt.
If Pinc.1 = 0 Then Portd.7 = Not Portd.7 'Grüne LED (Pin PD7) an oder aus, wenn Taster 2 an Pin C1 gedrückt.
Return 'Verläßt die On Interrupt-Funktion (On Pcint1 Taster).

End 'Programmende.


Die PWM-Geschichte funktioniert auch, wenn ich auch noch Probleme habe sie extern zu takten...aber das kommt noch!

Was meinst Du, ist das so sauber und OK?

Nochmals Danke!

Wolfram