Subject: Klausur Oktober 2008
Ich habe versucht die Programmieraufgabe zu lösen und diese über den Mikrokontroller laufen zu lassen.
Natürlich musste ich einige Änderungen vornehmen.
Meiner Meinung nach sollte das so laufen.
Es treten aber zwei Fehler auf:
1.Wenn der Mikrokontroller aus der Schlafphase erwacht, dann setzt er speed nur 5000, wenn ich vorher z.B.
noch eine Warteschleife laufen lass.(In den Kommentaren Versuch mit der Warteschleife)
2.Bei Knopfdruck hat man das Gefühl, dass der Mikrokontroller sofort auf Vollspeed schaltet.
Was ist also falsch am Programm?
Natürlich musste ich einige Änderungen vornehmen.
Meiner Meinung nach sollte das so laufen.
Es treten aber zwei Fehler auf:
1.Wenn der Mikrokontroller aus der Schlafphase erwacht, dann setzt er speed nur 5000, wenn ich vorher z.B.
noch eine Warteschleife laufen lass.(In den Kommentaren Versuch mit der Warteschleife)
2.Bei Knopfdruck hat man das Gefühl, dass der Mikrokontroller sofort auf Vollspeed schaltet.
Was ist also falsch am Programm?
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <avr/sleep.h>
- #include <led.h>
- static volatile unsigned int speed = 5000;
- void init();
- void wait(unsigned int);
- ISR(INT0_vect){
- if(speed>1000){
- speed -= 1000;
- }
- }
- void main(){
- /*volatile unsigned int z;*/
- int i = 0;
- init();
- sei();
- while(1){
- for(i=0;i<8;i++){
- int pin;
- PORTD &=~ (1<<7);
- PORTC &=~ (1<<0);
- PORTC &=~ (1<<1);
- PORTC &=~ (1<<6);
- PORTC &=~ (1<<7);
- PORTA &=~ (1<<7);
- PORTA &=~ (1<<6);
- PORTA &=~ (1<<5);
- switch(i) {
- case 0:
- pin = 7;
- break;
- case 1:
- pin = 0;
- break;
- case 2:
- pin = 1;
- break;
- case 3:
- pin = 6;
- break;
- case 4:
- pin = 7;
- break;
- case 5:
- pin = 7;
- break;
- case 6:
- pin = 6;
- break;
- case 7:
- pin = 5;
- break;
- }
- switch(i) {
- case 0:
- PORTD |= (1<<pin);
- break;
- case 1:
- PORTC |= (1<<pin);
- break;
- case 2:
- PORTC |= (1<<pin);
- break;
- case 3:
- PORTC |= (1<<pin);
- break;
- case 4:
- PORTC |= (1<<pin);
- break;
- case 5:
- PORTA |= (1<<pin);
- break;
- case 6:
- PORTA |= (1<<pin);
- break;
- case 7:
- PORTA |= (1<<pin);
- break;
- }
- cli();
- wait(speed);
- sei();
- }
- cli();
- if(speed<10000){
- speed += 1000;
- } else {
- sleep_enable();
- sei();
- sleep_cpu();
- sleep_disable();
- /*z = 0;
- while(z<50000){
- z++;
- }*/
- cli();
- speed = 5000;
- sei();
- }
- }
- }
- void init(){
- DDRD |= (1<<7);
- DDRC |= (1<<0);
- DDRC |= (1<<1);
- DDRC |= (1<<6);
- DDRC |= (1<<7);
- DDRA |= (1<<7);
- DDRA |= (1<<6);
- DDRA |= (1<<5);
- PORTD |= (1<<7);
- PORTC &=~ (1<<0);
- PORTC &=~ (1<<1);
- PORTC &=~ (1<<6);
- PORTC &=~ (1<<7);
- PORTA &=~ (1<<7);
- PORTA &=~ (1<<6);
- PORTA &=~ (1<<5);
- DDRD &= ~0x04;
- PORTD|= 0x04;
- MCUCSR |= (1<<ISC00);
- MCUCSR |= (1<<ISC01);
- /*MCUCSR |= (1<<(ISC00|ISC01));*/
- GICR |= (1<<INT0);
- }
- void wait (unsigned int interval){
- volatile unsigned int i = 0;
- while(i<interval){
- i++;
- }
- }
Show profile
Link to this post