Hallo Leute versuche vergebens meine Taster am Avr zum laufen zu
bringen. Es scheitert schon beim Compilieren.Könnte jemand da vielleicht
netterweise mal drübergucken oder mir nen heissen Tipp geben?
Hier mein code:
Main Code
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
/* Wir haben 3 Taster, in taster.h wird also angepasst zu
5
#define NUM_TASTER 3
6
*/
7
#include"taster.h"
8
9
/*
10
* Die Taster-Ports sind hartcodiert:
11
* #0 --> PortB.4
12
* #1 --> PortC.1
13
* #2 --> PortD.2
14
*/
15
16
/* Bei 1MHz Grundtakt läuft Timer0 alle 256µs über.
17
* Um auf rund 10ms zu kommen, rufen wir get_taster nur
18
* jedes 39. mal auf. */
19
SIGNAL(SIG_OVERFLOW0)
20
{
21
staticunsignedcharcount_ovl0;
22
unsignedcharovl0=count_ovl0+1;
23
24
if(ovl0>=39)
25
{
26
get_taster(0,PINB&(1<<PB4));
27
get_taster(1,PINC&(1<<PC1));
28
get_taster(2,PIND&(1<<PD2));
29
30
ovl0=0;
31
}
32
33
count_ovl0=ovl0;
34
}
35
36
voidioinit()
37
{
38
/* Taster sind Input (default nach RESET) */
39
/* An den Tastern die PullUps aktivieren */
40
PORTB|=1<<PB4;
41
PORTC|=1<<PC1;
42
PORTD|=1<<PD2;
43
44
/* Timer0 ohne Prescaler starten */
45
TCCR0=1<<CS00;
46
47
/* Timer0-Overflow-Interrupt aktivieren */
48
TIMSK|=(1<<TOIE0);
49
}
50
51
intmain()
52
{
53
ioinit();
54
55
/* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */
56
tasten[0].mode=TM_SHORT;
57
tasten[1].mode=TM_LONG;
58
tasten[2].mode=TM_REPEAT;
59
60
/* Interrupts global aktivieren */
61
sei();
62
63
/* Hauptschleife */
64
while(1)
65
{
66
signedchartast=taster;
67
68
switch(tast)
69
{
70
default:
71
caseNO_TASTER:
72
break;
73
74
case0:
75
/* Taster 0 */
76
break;
77
78
case1:
79
/* Taster 1 kurz gedrueckt */
80
break;
81
82
case1+TASTER_LONG:
83
/* Taster 1 lange gedrueckt */
84
break;
85
86
case2:
87
/* Taster 2 */
88
break;
89
}
90
91
if(tast!=NO_TASTER)
92
taster=NO_TASTER;
93
94
/* ********************************** */
95
/* Weiterer Code in der Hauptschleife */
96
}
97
}
Taster.h
1
#ifndef _TASTER_H_
2
#define _TASTER_H_
3
4
/* Wert fuer taster, wenn nichts gedrückt wurde */
5
#define NO_TASTER (-1)
6
7
/* Maximale Anzahl der Taster */
8
#define NUM_TASTER 4
9
10
/* 0 --> Taster sind low-aktiv */
11
/* 1 --> Taster sind high-aktiv */
12
#define TASTER_LEVEL 0
13
14
/* Dieser Offset wird zur Tasten-Nummer addiert, */
15
/* wenn eine Taste lange gedrückt wurde */
16
#define TASTER_LONG 16
17
18
/* Zeitverzögerung (in Ticks), bis zum Beginn von auto-repeat */
19
#define TASTER_REPEAT_DELAY (60)
20
21
/* Zeitverzögerung (in Ticks), bis zum nächsten auto-repeat */
22
#define TASTER_REPEAT (15)
23
24
/* Ab dieser Dauer wird der Tastendruck 'lange' */
25
#define TASTER_DELAY_LONG (80)
26
27
typedefstruct
28
{
29
/* private */
30
constunsignedchardelay,old;
31
32
/* Mode des Tasters aus: TM_SHORT, TM_LONG, TM_REPEAT */
33
unsignedcharmode;
34
}taste_t;
35
36
externtaste_ttasten[];
37
38
/* In dieser Variable kann abgefragt werden, welche Taste gedrückt wurde.
39
--> NO_TASTER:
40
es wurde nichts gedrückt
41
--> 0..NUM_TASTER-1:
42
Taster Numero 'taster' wurde (kurz) gedrückt
43
--> TASTER_LONG ... TASTER_LONG + NUM_TASTER-1:
44
Taster Numero 'taster-TASTER_LONG' wurde lange gedrückt
Taser schrieb:
> Ich bekomme den Fehler beim Compilierent dass sowolh Taster,Tasten und> get_taster nicht definiert sind?
Das stellt aber nicht der Compiler fest, sondern der Linker.
> Habe ich jedoch gemacht?
Ja hast da.
Aber weiss deine Entwicklungsumgebung auch, dass Tester.c zum Projekt
mit dazugehört und daher compiliert und ins EXE mit eingelinkt werden
muss?
Taser schrieb:
> Ja ich hab das c.File sowie das .h File in den dazugehörigen Ordner im> AVR studio drinnen.
Beobachte mal das Output Fenster.
Welche Kommandos werden vor der Fehlermeldung ausgeführt?
Taucht da Tasten.c auf?
(mach am besten einen Screenshot, Output Fenster dabei so gross wie
möglich machen)
Ist furchtbar schlecht zu lesen. JPG ist bei Bilder, bei denen es in
erster Linie auf den Text ankommt, keine gute Wahl.
Aber ich kann in der 2.ten mit einem grünen Punkt markierten Zeile die
taster.o nicht finden. Die sollte aber dort sein.
Nimm tester.c noch mal aus dem Projekt raus und fügs neu ein.
Wieso hast du unter 'Other Files' ein makefile eingetragen?
Benutzt du ein externes makefile?
Wenn ja, dann muss taster.c dort auch eingetragen sein, was es offenbar
nicht ist.
Wenn es keinen wirklichen Grund für ein externes makefile gibt, dann
schalte zurück auf 'AVR-Studio generiert das makefile selber'.
Taser schrieb:
> Nein ich benutze kein externes Makefile- das hat sich wohl da drinnen> verirrt.
Tja. Aber irgendwo muss es herkommen.
Fakt ist, dass dein taster.o nicht mit eingelinkt wird. Sieht man
deutlich an der Commandline. taster.o taucht dort nirgends auf.
Wird taster.c neu compiliert, wenn du im Quellcode was veränderst?
Wenn alle Stricke reissen und du nichts rausfindest, dann Plan B
starten:
Neues AVR-Studio Projekt anlegen. Mega8 auswählen.
Die Source Code Dateien aufs Projektverzeichnis kopieren und mit 'Add
Source Files' hinzufügen. Das Default-generierte File rauswerfen und
Projekt builden lassen.
Plan B geht oft schneller als das Rausfinden, wie und wo du das alte
Projekt verkonfiguriert hast.
Ich hab gestern nochmals vergeblich probiert die Taster zum Laufen zu
bringen:
Folgender Code wurde verwendet und die entsprechende lcd.h sowie lcd.c
wurden im Source Ornder neu angeleget um etwaige Fehler wie zuvor zu
vermeiden.
Der Code sieht nun so aus:
1
// ATMega8 LCD Driver
2
//
3
// (C) 2009 Radu Motisan , radu.motisan@gmail.com
4
// www.pocketmagic.net
5
// All rights reserved.
6
//
7
// test.c: sample test for the HD44780 LCD functions
8
// For more details visit the website.
9
10
11
#include<avr/io.h>
12
#include<avr/interrupt.h>
13
14
/* Wir haben 3 Taster, in taster.h wird also angepasst zu
15
#define NUM_TASTER 3
16
*/
17
#include"taster.h"
18
#include"lcd.h"
19
/*
20
* Die Taster-Ports sind hartcodiert:
21
* #0 --> PortB.4
22
* #1 --> PortC.1
23
* #2 --> PortD.2
24
*/
25
26
/* Bei 1MHz Grundtakt läuft Timer0 alle 256µs über.
27
* Um auf rund 10ms zu kommen, rufen wir get_taster nur
28
* jedes 39. mal auf. */
29
SIGNAL(SIG_OVERFLOW0)
30
{
31
staticunsignedcharcount_ovl0;
32
unsignedcharovl0=count_ovl0+1;
33
34
if(ovl0>=39)
35
{
36
get_taster(0,PINB&(1<<PB4));
37
38
39
ovl0=0;
40
}
41
42
count_ovl0=ovl0;
43
}
44
45
voidioinit()
46
{
47
/* Taster sind Input (default nach RESET) */
48
/* An den Tastern die PullUps aktivieren */
49
PORTB|=1<<PB4;
50
51
52
/* Timer0 ohne Prescaler starten */
53
TCCR0=1<<CS00;
54
55
/* Timer0-Overflow-Interrupt aktivieren */
56
TIMSK|=(1<<TOIE0);
57
}
58
59
intmain()
60
{
61
lcd_init();
62
ioinit();
63
64
/* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */
65
tasten[0].mode=TM_SHORT;
66
tasten[1].mode=TM_LONG;
67
tasten[2].mode=TM_REPEAT;
68
69
/* Interrupts global aktivieren */
70
sei();
71
72
/* Hauptschleife */
73
while(1)
74
{
75
signedchartast=taster;
76
77
switch(tast)
78
{
79
default:
80
caseNO_TASTER:
81
break;
82
83
case0:
84
/* Taster 0 */
85
break;
86
87
case1:
88
lcd_string2("Hello World! ");
89
break;
90
91
case1+TASTER_LONG:
92
/* Taster 1 lange gedrueckt */
93
break;
94
95
case2:
96
/* Taster 2 */
97
break;
98
}
99
100
if(tast!=NO_TASTER)
101
taster=NO_TASTER;
102
103
/* ********************************** */
104
/* Weiterer Code in der Hauptschleife */
105
return0;
106
}
107
}
Ich hab jetzt einfach mal einen Output für das Lcd in die Switch
Anweisung geschrieben.
Angezeigt am Lcd bekomme ich nur Balken. Der Taster ist ein uTaster
ausgelötet aus dem Bedienpanel einer alten Stereoanlage und wurde auf
Funktionialität mit dem Durchgangsprüfer geprüft. Ergebnis: Taster funzt
Ich habe den Taster so verschaltet wie im uC.net Tutorial, ich glaube
das heisst low-active oder so.
Ich bin echt ratlos was dieses Problem betrifft und ich hoffe erneut ,
dass ein Netter "Mituser" sich meiner erbarmt und mir ein bisschen auf
die Sprünge hilft.
Vielen Dank
Hallo,
ein Balken im LCD bedeutet entweder falsche Kontrastspannung oder nicht
richtig initialisiert. was passiert denn bei deinem lcd_init()? Du hast
nirgends deine Ports fürs LCD definiert, is das in lcd_init() mit
drinnen.
doch die sind wie oben geschrieben in der lcd.h bzw lcd.c drinnen .
Es ist kein schwarze Balken sondern Ein Balken der kurz blinkt und dan
ein strich wird und das ganze geht halt ewig.
Gruß
wenn der balken weg geht und ein Strich an der ersten Stelle kommt,
scheint das Initialisieren zu funktionieren. das Blinken macht der
ständig oder nur wenn der taster gedrückt wird?
wenn ich das richtig sehe, beendest du die schleife nach dem ersten
durchlauf, wodurch ja eigentlich das prog immer wieder neu gestartet und
alles neu initialisiert wird. also das return 0; an der stelle sollte
fehl am platz sein.
Ok beim weglassen des return 0; ist auch nichts passiert.
Kann es sein dass AVR Studio Probleme macht und dass der Quelltext bis
auf das return 0; i.0 ist?
Gruß
da du deine Taster über nen Timer abfragst und der Balken immer kommt
und geht auch ohne gedrückten Taster, wird das nicht an prellenden
Tastern liegen. Sieht wirklich so aus als würde dein LCD ständig neu
initialisiert (return 0, is ja jetzt weg, oder?). Schreib mal in einen
case eine Endlosschleife, wenn das Programm da rein kommt sollte der
Blaken dauerhaft wegbleiben.
KEY_DDR, KEY_PORT, KEY_PIN legen fast an welchem Port sich die Tasten
befinden.
KEY0, KEY1, KEY2 (und wenn du brauchst KEY3, KEY4, KEY5, KEY6 und KEY7)
legen fest welche Pins an diesem Port benutzt werden, um Tasten
auszulesen.
ALL_KEYS ist die Zusammenfassung aller definierten KEYx. Wenn du also
noch ein zusätzliches KEY3 hast, dann nimmst du das dort mit auf
1
#define KEY2 2
2
#define KEY3 5 // der vierte Taster liegt an Pin 5
und die REPEAT_MASK schlussendlich legt fest, auf welche der Taster ein
automatischer Autorepeat gelegt werden soll.
Für die Tastenmakros kann man auch schöne, anwendungsbezogene Namen
nehmen. Die entsprechenden #define werden nur in der Auswertung benutzt.
Die eigentliche Entprellerei ist davon unbeeindruckt.