Hi,
ich bins schon wieder, mit einem anderen Problem. :D
Ich wollte zum testen des Sleep-Modes "Power Done Mode" eine LED des
STK500 auf Knopfdruck blinken lassen und bei nem anderen Knopf in den
Sleep-Modus versetzen. Leider scheitere ich schon am blinken der LED,
weiß nicht woran es liegt. Evtl könnt ihr mir ja auch generelle Tips zum
Code geben:
main.c
1
#define F_CPU 8000000
2
3
#include<avr/io.h>
4
#include<avr/interrupt.h>
5
#include"taster.h"
6
#include<util/delay.h>
7
#define TEILER 0x2 // Teiler des Haupttaktes
8
#define INTRP (65536 - 49997) // Anfangswert des Timers1
9
10
uint8_ttasttest=0;
11
12
ISR(TIMER1_OVF_vect)// Timer1 Interrupt
13
{
14
TCNT1=INTRP;// Prescaler neu setzen
15
taster_get_status(1,PIND&(1<<PD3));
16
taster_get_status(2,PIND&(1<<PD4));
17
taster_get_status(3,PIND&(1<<PD5));
18
taster_get_status(4,PIND&(1<<PD6));
19
taster_get_status(5,PIND&(1<<PD7));
20
if(tastst!=5)tasttest=0;
21
22
23
}
24
25
voidlong_delay(uint16_tms){
26
for(;ms>0;ms--)_delay_ms(1);
27
}
28
29
30
voidioinit()
31
{
32
DDRA|=(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6);// DDR für Port A setzten
33
PORTA=0xFF;// Port für die LEDs auf Highe schaten (für STK500)
Du hast -noch- einen schönen programmierstil -rein formal-, versuch den
so beizubehalten.
Allerdings finde ich Deinen Code zu umständlich. In der ISR würde ich
nur Variablen setzen die dann im Hauptprg. ausgewertet werden. Das ganze
geht auch ohne globale Variablen.
Tip: schau Dir nochmal die Definition zu switch() an.
Zee wrote:
> Du hast -noch- einen schönen programmierstil -rein formal-, versuch den> so beizubehalten.
Bis auf eines:
Das Delay 1000ms bereitet mir Bauchschmerzen.
In der Regel macht man damit jeden Programmfluß kaputt und verhindert
eine ergonomische Bedienung.
Ich hatte kürzlich mal ein ähnliches Programm für nen ATtiny13
geschrieben:
http://www.mikrocontroller.net/attachment/42337/sleep.zip
Die Taste schaltet: ein, blinken, aus usw.
Außer beim Blinken geht er in Powerdown.
Die Entprellroutine entprellt immer den ganzen Port (bis zu 8 Tasten),
hier wird aber nur eine abgefragt.
Ein Tastenzustand wird übernommen, wenn er mindestens 4-mal
hintereinander gleich war.
Nebenbei erfolgt noch ne Fankenerkennung, da man ja oft nur eine Aktion
beim Drücken auslösen will und nicht, solange man drückt.
Peter
P.S.:
Stefan wird recht haben mit volatile.
also ich weiß was du da machst, allerdings weiß ich nicht was du z.B.
mit dem b0:1 machst oder was __attribute__((_packed_)) das bedeutet.
Und so einige andere Sachen auch nicht, da sich das C das ich gelernt
hab von deinem Codestil unterscheidet.^^
Hab jetzt ein volatile vor die Variable tasttest gesetzte, es ändert
sich alleridngs nicht, wenn ich case 5, also die LED blinkt, bin dann
komm ich nicht mehr aus der while-schleife raus. Obwohl tasttest = 0
ist.
Sebastian Baier wrote:
> Das sieht sehr kompakt aus, hilft mir aber nur wenn ich durch den Code> durchsteige.
Frag ruhig.
> z.B. verstehe ich diese Zeile nicht wirklich:>>>
Das wird z.B. hier erklärt:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=67368&start=all
Im Steuerungsanwendungen ist es typisch, daß IO-Pins verschiedene
Funktionen haben und daher wäre es übersichtlicher, wenn man sie auch
separat ansprechen kann.
Einige MC-Compiler kennen deshalb Bitvariablen, wie z.B. der Keil C51.
Beim GCC kann man es mit diesem Macro machen.
> da sich das C das ich gelernt> hab von deinem Codestil unterscheidet.^^
Kann ich mir gut vorstellen, da ich C nie offiziell gelernt habe.
Ich habs hauptsächlich im Selbststudium über Turbo-Pascal, Turbo-C, Keil
C51 und WINAVR gelernt.
Peter
Sebastian Baier wrote:
> Danke Peter, allerdings interssiert mich trotzdem warum mein Programm> nicht mehr aus der While-schleife raus spingt, hat da jemand ein ahnung?
Könnte daran liegen:
1
tasthw=NOT_PRESSED;// rücksetzen der Variable für den Hardwarstatus des Tastes
2
}
Diese Zeile ist toter Code und wird vom Compiler auch rausgeschmissen.
Peter
Daran liegts nicht, es funktiniert und es lag am volatile. hab nur nicht
gecheckt, dass es funktioniert da mich der simulator etwas irritiert
hatte.
Vielen Dank