Hir werden die beiden ISC-Bits gelöscht? (C-Syntax) dann paßt es eigentlichCode:... int main(void) { OCR0A = 77; // Legt den Wert ZUM Überlaufes fest ( ca. jede 10 ms.) TCCR0A |= (1<<WGM01); // Compare Match (Normal Mode) keine Funktion am PIN && TIFR |= 0x01; // Clear Interrupt Flag ( Wird nur für Polling benötigt! Nicht für Interrupt ) TIMSK |= (1<<OCIE0A); // Compare Match Interrupt enable TCCR0B |= ((1<<CS02) | (1<<CS00)); // Prescaler auf 1024 setzen (F_CPU/1024) OCR1A = HELLIGKEIT; // Legt den Wert des Überlaufes fest TCCR1A |= 0x00; // Compare Match (Normal Mode) keine Funktion am PIN TIFR |= 0x01; // Clear Interrupt Flag ( Wird nur für Polling benötigt! Nicht für Interrupt ) TIMSK |= ((1<<OCIE1A) | (1<<TOIE1)); // Compare Match Interrupt enable TCCR1B |= (1<<CS10); // Prescaler auf 0 setzen (F_CPU) GIMSK |= ((1<<INT0) | (1<<INT1)); // Interrupt "INT0 & INT1" aktivieren [B][COLOR="#FF0000"] MCUCR &= ~((1<<ISC01) | (1<<ISC00)); [/COLOR][/B] sei(); // Interrupts global aktivieren // set_sleep_mode(SLEEP_MODE_PWR_DOWN); // µC sagen in welchen sleep_mode er gehen soll (POWER_DOWN) ca. 20 µA (0,000020 A) // sleep_mode(); // Setzt den µC (nach Batteriewechsel) in den sleep_mode Auto_Off = ABSCHALTZEIT; OCR1A = 800; set_sleep_mode(SLEEP_MODE_PWR_DOWN); // µC sagen in welchen sleep_mode er gehen soll (POWER_DOWN) ca. 20 µA (0,000020 A) ...
while(1)
{
if ((Auto_Off == ABSCHALTZEIT) || (TCCR1B & (1<<CS10))) // Ist Auto_Off = ABSCHALTZEIT, dann schlafen!
{
[COLOR="#FF0000"][B] INT0_ENABLE;[/B][/COLOR]
Auto_Off=0;
TIMER1_STOP;
XPE_1_AUS; XPE_2_AUS; XPE_3_AUS; XPE_4_AUS;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // µC sagen in welchen sleep_mode er gehen soll (POWER_DOWN) ca. 20 µA (0,000020 A)
sleep_mode(); // Schlafen aktivieren!
}
}// Ende While
keiner ne Idee ?!
#define INT0_ENABLE GIMSK |= (1<<INT0);
das kann nicht gehen ? bekommst du keine Warnung oder Fehlermeldung???
Das Semikolon gehört am Ende weg ! (das ist übrigens bei mehreren Makros bei dir so.....)
if ((Auto_Off == ABSCHALTZEIT) || (!(TCCR1B & (1<<CS10)))) // Ist Auto_Off = ABSCHALTZEIT, dann schlafen!
{
Auto_Off=0;
TIMER1_STOP;
XPE_1_AUS; XPE_2_AUS; XPE_3_AUS; XPE_4_AUS;
[COLOR="#FF0000"][B] _delay_ms(200); [/B][/COLOR]
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode(); // Setzt den µC (nach Batteriewechsel) in den sleep_mode
}
Hallo avr_newbie,
das sollte eigentlich funktionieren, ich sehe hier keinen Fehler.
Es gibt dann einen Fehler, wenn man zB bei einem logischen Ausdruck für eine if-Anweisung ein Semikolon verwendet, dort muss man auch ggf. Klammern setzen.
Dirk
also ich habe bis jetzt noch nie ein Makro mit nem Semikolon am Ende gesehn..... schon allein, dass ein Makro ja mit #define anfängt finde ich das ganze eher untypisch, da noch das Semikolon hinten dran zu hängen....
Via PN hattest Du geantwortet, daß Du's (mehr oder weniger) noch tust, und gefragt was Du ändern müßtest......Siehst Du eigentlich selbst bei Deinem Konzept noch durch? Ich tu's nämlich nicht. Du solltest ja eigentlich mal'n Programmablaufplan als Diskussionsbasis erstellen.
/*
* ATtiny2313A @ 1MHz
* PWM-Ausgabe an OC0A (Timer0, fix 50%, 61Hz)
* Int0 schaltet PWM an/aus
* Entprellung über Timer1 (CTC, 250ms)
* für den LA wird OC0A beim abschalten auf Gnd gehalten (statt tristate)
* B3 während des INT0 High
* B4 während T1 läuft High
*/
.equ PWM_aus = (1<<wgm01)|(1<<wgm00)
.equ PWM_an = (1<<com0a1)|(1<<com0a0)|(1<<wgm01)|(1<<wgm00)
.equ startTIM1 = (1<<wgm12)|(1<<cs11)
.equ stopTIM1 = (1<<wgm12)
.equ int0_LED = PB3
.equ T1_LED = PB4
.equ T0comp=127 ;50%
.equ T1comp=31249 ;250ms
.org 0x00
rjmp start
.org INT0addr
rjmp tasterErkannt
start:
;***Beinchen*** einstellen
;INT0-Bein via internem Pullup hochziehen
sbi portd, portd2
;PWM-Ausgabe und Stausausgabe-Beinchen auf Ausgang schalten
ldi r16, (1<<PB2)|(1<<int0_LED)|(1<<T1_LED)
out DDRB, r16
;***Timer0*** PWM-Ausgabe Kanal A, 50%, ca 61Hz
ldi r16, PWM_aus
out tccr0a, r16 ;FastPWM KanalA (aus)
ldi r16, T0comp
out ocr0a, r16 ;50%
ldi r16, (1<<cs01)|(1<<cs00)
out tccr0b, r16 ;Prescaler=64 -> 61Hz
;***Timer1*** "Entprellung" ca 250ms (CTC bis OC1A=31249, Prescaler=8)
;TCCR1A bleibt default, TCCR1B wird in den IRQs geschrieben, TCCR1C ist ungenutzt
ldi r16, high(T1comp)
out OCR1AH, r16
ldi r16, low(T1comp)
out OCR1AL, r16 ;Reichweite festlegen (CTC)
;***INT0*** low-Level ist default
ldi r16, (1<<int0)
out gimsk, r16 ;IRQ scharf
sei
loop:
in r16, tifr
andi r16, (1<<ocf1a) ;Z=0 bei Flag=1
breq loop ;Sprung bei Z=1, also FLag=0
ldi r16, (1<<ocf1a)
out tifr, r16 ;flag gelöscht
ldi r16, stopTIM1
out tccr1b, r16 ;Entprelltimer steht
cbi portb, T1_LED
ldi r16, (1<<INT0)
out gimsk, r16 ;INT0 reaktiviert
;sleep?
rjmp loop
tasterErkannt:
sbi portb, int0_LED
push r16
in r16, sreg
push r16
ldi r16, 0
out gimsk, r16 ;INT0 deaktiviert Cave!! alle anderen auch
ldi r16, startTIM1
out tccr1b, r16 ;Entprelltimer läuft
sbi portb, T1_LED
in r16, tccr0a
subi r16, (1<<com0a1)|(com0a0)
brcc compModeSchreiben
ldi r16, (1<<com0a1)|(1<<com0a0)|(1<<wgm01)|(1<<wgm00)
compModeSchreiben:
out tccr0a, r16 ;compareMode invertiert
pop r16
out sreg, r16
pop r16
cbi portb, int0_LED
reti
Anfrage an Dino bzw andere MODs: Wie bekomme ich die Anzeige der Bilder erzwungen - also auf einem größeren Maß?
stimmt. So gehts.Auch wenn ich weder Dino noch Mod bin, du musst in den WYSIWYG Editor wechseln (das erste Symbol im Editor) und denn doppelt auf das Bild klicken, dann öffnet sich ein Menü worin du die Größe festlegen kannst