Step
30.08.2006, 00: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
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