Kani-Coaching (C lernen mit Nomis)

Ich habe dann mal ein bisschen gebastelt.
Leider funktioniert meine Tastenabfrage nicht, kann mir jemand kurz erklären wieso nicht? Ich habe die Schonmal getestet, da hat sie funktioniert.
Ich habe die Taster so angeschlossen: PE0,1,2 => Taster =>GND.



CodeBox C

/* Vitrinen-Schaltung
Version: 0.1
Datum: 13.04.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/


/* PE 0-2 = Taster für rauf, runter und Moduswahl
PD 6-7 = Transistoren (BC557)
PC 0-7 = Kathoden der Segmente

PA0 = Rot unten
PA1 = Blau unten
PA2 = Grün unten
PA3 = Rot mitte
PA4 = Blau mitte
PA5 = Grün mitte
PA6 = Rot oben
PA7 = Blau oben
PB0 = Grün oben
*/

//#define F_CPU 16000000UL;

#include <avr/io.h>
//#include <util/delay.h>



int main (void)
{
DDRE = 0b00000000; // Taster auf Eingang (PE0-2)
PORTE = 0b11111111; // Int. Pullups aktivieren

DDRC = 0b11111111; // Segmente der 7-Segment-Anzeige
PORTC = 0b11111111; // Kathoden der Segmente aus (An = 0)

DDRD = 0b11111111; // Ausgang für Transistoren
PORTD = 0b11000000; // Transistoren aus

int aktuelles_programm = 0;
int aktueller_modus = 0;
static unsigned char zustand_taster_hoch;
static unsigned char zustand_taster_runter;
static unsigned char zustand_taster_modus;
int seg_zehner, seg_einer, ziffern_zuweiser;
unsigned char seg[] =
{
0b11100111,//0
0b10000100,//1
0b11010011,//2
0b11010110,//3
0b10110100,//4
0b01110110,//5
0b01110111,//6
0b11000100,//7
0b11110111,//8
0b11110110,//9
};


while(1)
{

// =========================================================
// ===== Moduswahltaster abfragen und verarbeiten =====
// =========================================================


if(zustand_taster_modus == 0 && !(PINE & (1<<PE2))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_modus = 1;
}
else if (zustand_taster_modus == 1 && !(PINE & (1<<PE2))) //Taster wird gehalten
{
zustand_taster_modus = 2;
}
else if (zustand_taster_modus == 2 && (PINE & (1<<PE2))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_modus = 3;
}
else if (zustand_taster_modus == 3 && (PINE & (1<<PE2))) //Taster losgelassen
{
zustand_taster_modus = 0;
}

if(zustand_taster_modus == 1)
{
aktueller_modus++;
}

if(aktueller_modus > 1)
{
aktueller_modus = 0;
}

// =====================================
// ===== MODUS 0 (PROGRAMMWAHL) =====
// =====================================

if(aktueller_modus == 0)
{
// =============================
// ===== TASTER ABFRAGEN =====
// =============================

// Taster zum hochschalten

if(zustand_taster_hoch == 0 && !(PINE & (1<<PE0))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_hoch = 1;
}
else if (zustand_taster_hoch == 1 && !(PINE & (1<<PE0))) //Taster wird gehalten
{
zustand_taster_hoch = 2;
}
else if (zustand_taster_hoch == 2 && (PINE & (1<<PE0))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_hoch = 3;
}
else if (zustand_taster_hoch == 3 && (PINE & (1<<PE0))) //Taster losgelassen
{
zustand_taster_hoch = 0;
}

// Taster zum runterschalten

if(zustand_taster_runter == 0 && !(PINE & (1<<PE1))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_runter = 1;
}
else if (zustand_taster_runter == 1 && !(PINE & (1<<PE1))) //Taster wird gehalten
{
zustand_taster_runter = 2;
}
else if (zustand_taster_runter == 2 && (PINE & (1<<PE1))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_runter = 3;
}
else if (zustand_taster_runter == 3 && (PINE & (1<<PE1))) //Taster losgelassen
{
zustand_taster_runter = 0;
}

// =================================
// ===== TASTER VERARBEITEN =====
// =================================

if(zustand_taster_hoch == 1)
{
aktuelles_programm++;
}
if(zustand_taster_runter == 1)
{
aktuelles_programm--;
}

// =========================
// 7-SEGMENT-ANZEIGEN =====
// =========================

// Anzeige splitten

seg_zehner = aktuelles_programm/10;
seg_einer = aktuelles_programm-(seg_zehner*10);

// Transistoren schalten

if(ziffern_zuweiser > 2)
{
ziffern_zuweiser = 1;
}

if(ziffern_zuweiser == 1)
{
PORTD = 0b10111111;
PORTC =~ seg[seg_zehner];
}
if(ziffern_zuweiser == 2)
{
PORTD = 0b01111111;
PORTC =~ seg[seg_einer];
}
} // END-PROGRAMMWAHL


} // END-WHILE(1)




} // END-MAIN
 
Ich habe ein Problem mit der delay-Funktion.
Folgende Fehler:
c:/program files/winavr/lib/gcc/../../avr/include/util/delay.h: In function '_delay_us':
c:/program files/winavr/lib/gcc/../../avr/include/util/delay.h:111: error: expected ')' before ';' token
c:/program files/winavr/lib/gcc/../../avr/include/util/delay.h: In function '_delay_ms':
c:/program files/winavr/lib/gcc/../../avr/include/util/delay.h:145: error: expected ')' before ';' token
c:/program files/winavr/lib/gcc/../../avr/include/util/delay.h:155: error: expected ')' before ';' token
make: *** [vitrinev2.o] Error 1
Build failed with 3 errors and 0 warnings...
Komisch oder? Kann vielleicht jemand die delay.h hochladen?
 
Zeig mal den Code, die Fehler sind nicht immer dort wo der Compiler sie anzeigt.
Also zeig mal deinen Code, die delay.h kannst du lassen wo sie ist.
 


CodeBox c
/* Vitrinen-Schaltung
Version: 0.1
Datum: 13.04.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/


/* PE 0-2 = Taster für rauf, runter und Moduswahl
PD 6-7 = Transistoren (BC557)
PC 0-7 = Kathoden der Segmente

PA0 = Rot unten
PA1 = Blau unten
PA2 = Grün unten
PA3 = Rot mitte
PA4 = Blau mitte
PA5 = Grün mitte
PA6 = Rot oben
PA7 = Blau oben
PB0 = Grün oben
*/

#define F_CPU 16000000UL;

#include <avr/io.h>
#include <util/delay.h>



int main (void)
{
DDRE = 0b00000000; // Taster auf Eingang (PE0-2)
PORTE = 0b11111111; // Int. Pullups aktivieren

DDRC = 0b11111111; // Segmente der 7-Segment-Anzeige
PORTC = 0b11111111; // Kathoden der Segmente aus (An = 0)

DDRD = 0b11111111; // Ausgang für Transistoren
PORTD = 0b11000000; // Transistoren aus

int aktuelles_programm = 9;
/* int aktueller_modus = 0;
static unsigned char zustand_taster_hoch;
static unsigned char zustand_taster_runter;
static unsigned char zustand_taster_modus;*/
int seg_zehner, seg_einer, ziffern_zuweiser;
unsigned char seg[] =
{
0b11100111,//0
0b10000100,//1
0b11010011,//2
0b11010110,//3
0b10110100,//4
0b01110110,//5
0b01110111,//6
0b11000100,//7
0b11110111,//8
0b11110110,//9
};

while(1)
{
ziffern_zuweiser++;

// =========================
// 7-SEGMENT-ANZEIGEN =====
// =========================

// Anzeige splitten

seg_zehner = aktuelles_programm/10;
seg_einer = aktuelles_programm-(seg_zehner*10);

// Transistoren schalten

if(ziffern_zuweiser > 2)
{
ziffern_zuweiser = 1;
}

if(ziffern_zuweiser == 1)
{
PORTD = 0b10111111;
PORTC =~ seg[seg_zehner];
}

if(ziffern_zuweiser == 2)
{
PORTD = 0b01111111;
PORTC =~ seg[seg_einer];
}
}
}



[
 
Bei #defines macht man keinen Strichpunkt.(naja, zumindest ist das hier der Fehler)
 
Hab mal wieder ein Problem. Irgendwie versteh ich das alles nicht, manchmal, wenn der nur der code für den Taster drin ist, funktioniert die Abfrage. Jetzt z.B. macht sie die ansteigende Flanke zu: Logisch 1 = Taster gedrückt. Und nicht nur bei einer Flanke.
Wenn ich jetzt drücke, ändert sich der Modus (zum testen habe ich denen erstmal feste Werte gegeben) nur solange ich auch drücke. Das will ich ja garnicht. Eine ansteigende Flanke = Modus 0 nocheine ansteigende Flanke = Modus 1 - noch eine wieder Modus = 0.



CodeBox C

/* Vitrinen-Schaltung
Version: 0.1
Datum: 13.04.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/


/* PE 0-2 = Taster für rauf, runter und Moduswahl
PD 6-7 = Transistoren (BC557)
PC 0-7 = Kathoden der Segmente

PA0 = Rot unten
PA1 = Blau unten
PA2 = Grün unten
PA3 = Rot mitte
PA4 = Blau mitte
PA5 = Grün mitte
PA6 = Rot oben
PA7 = Blau oben
PB0 = Grün oben
*/

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>



int main (void)
{
DDRE = 0b00000000; // Taster auf Eingang (PE0-2)
PORTE = 0b11111111; // Int. Pullups aktivieren

DDRC = 0b11111111; // Segmente der 7-Segment-Anzeige
PORTC = 0b11111111; // Kathoden der Segmente aus (An = 0)

DDRD = 0b11111111; // Ausgang für Transistoren
PORTD = 0b11000000; // Transistoren aus

DDRB = 0b11111111;
PORTB = 0b11111111;

int aktuelles_programm = 5;
int aktueller_modus = 0;
int aktuelle_geschwindigkeit = 8;
static unsigned char zustand_taster_hoch;
static unsigned char zustand_taster_runter;
static unsigned char zustand_taster_modus;
int seg_zehner, seg_einer;
int ziffern_zuweiser;
unsigned char seg[] =
{
0b11100111,//0
0b10000100,//1
0b11010011,//2
0b11010110,//3
0b10110100,//4
0b01110110,//5
0b01110111,//6
0b11000100,//7
0b11110111,//8
0b11110110,//9
};

while(1)
{
_delay_ms(5);
ziffern_zuweiser++;

if(zustand_taster_modus == 0 && !(PINE & (1<<PE0))) //Taster wird gedrueckt (steigende Flanke)
{
zustand_taster_modus = 1;
}
else if (zustand_taster_modus == 1 && !(PINE & (1<<PE0))) //Taster wird gehalten
{
zustand_taster_modus = 2;
}
else if (zustand_taster_modus == 2 && (PINE & (1<<PE0))) //Taster wird losgelassen (fallende Flanke)
{
zustand_taster_modus = 3;
}
else if (zustand_taster_modus == 3 && (PINE & (1<<PE0))) //Taster losgelassen
{
zustand_taster_modus = 0;
}



if(zustand_taster_modus == 1)
{
aktueller_modus++;
PORTB = 0b00000000;
}




if(aktueller_modus > 1)
{
aktueller_modus = 0;
}


if(aktueller_modus == 0)
{

// =================================
// ===== 7-SEGMENT-ANZEIGEN =====
// ===== GESCHWINDIGKEIT =========
// =================================

// Anzeigen splitten

seg_zehner = aktuelle_geschwindigkeit/10;
seg_einer = aktuelle_geschwindigkeit-(seg_zehner*10);

// Transistoren schalten

if(ziffern_zuweiser > 2)
{
ziffern_zuweiser = 1;
}

if(ziffern_zuweiser == 1)
{
PORTD = 0b01111111;
PORTC =~ seg[seg_zehner];
}

if(ziffern_zuweiser == 2)
{
PORTD = 0b10111111;
PORTC =~ seg[seg_einer];
}
}









else
{

// =================================
// ===== 7-SEGMENT-ANZEIGEN =====
// ===== PROGRAMM =========
// =================================

// Anzeige splitten

seg_zehner = aktuelles_programm/10;
seg_einer = aktuelles_programm-(seg_zehner*10);

// Transistoren schalten

if(ziffern_zuweiser > 2)
{
ziffern_zuweiser = 1;
}

if(ziffern_zuweiser == 1)
{
PORTD = 0b01111111;
PORTC =~ seg[seg_zehner];
}

if(ziffern_zuweiser == 2)
{
PORTD = 0b10111111;
PORTC =~ seg[seg_einer];
}
}


} // END-WHILE


} // END-MAIN


 
Kennt jemand von euch ein schönes Einsteigerprojekt?
Wie wäre es mit einer Funkuhr?
 
Hallo Kani.

Welch Überraschung. Die schaust öfters vorbei wie ich sehe?
Hast du denn schon ein passendes Projekt gefunden?
 
Hallo Leute.
Ja die Mühe mit mir war nicht vergebens. Projekt habe ich noch nicht gefunden. In ein paar Wochen muss ich mit einem Taster einen Microcontroller dazu bringen, per RS232-Schnittstelle einen beliebigen Buchstaben zu schreiben.
Also eigentlich einen Tastatur-Tastendruck simulieren.

Hat auch wieder was mit Veranstaltungstechnik zutun. Nicht nur aber auch. :p
 
Hi Kani,

Ja die Mühe mit mir war nicht vergebens.
das läßt einen die "Schmerzen" doch schon leichter ertragen ;) :D

Projekt habe ich noch nicht gefunden. In ein paar Wochen muss ich mit einem Taster einen Microcontroller dazu bringen, per RS232-Schnittstelle einen beliebigen Buchstaben zu schreiben.
Also eigentlich einen Tastatur-Tastendruck simulieren.

Hat auch wieder was mit Veranstaltungstechnik zutun. Nicht nur aber auch. :p
Ein paar Wochen sollten da wohl reichen ;) (Hoffe ich doch mal) :D

Gruß
Dino
 
Ne, also das Projekt, dass ich oben "vorgestellt" habe, ist eher sekundär.
So für nebenbei wo es auf 2 Wochen bis 1,5 Monate nicht so sehr drauf ankommt. Wird wahrscheinlich eh erst in einem halben Jahr was.

Hast du sonst ein schönes Projekt für mich??
 
Hi Kani.

Du könntest einen Taschenlaser auf 2 Servos kleben und damit Figuren(Kreise, 8ten oder so) an die Wand malen. In der Nacht und mit ausreichend schnellen Servos macht das sicher was her.
 
Hm, keine schlechte Idee. Hab(en) aber schon einen Laser.
http://www.thomann.de/de/medialas_spooky_blue_v3_150.htm

Im moment weiß ich echt nichts. Zu Blöd. -.-

Am liebsten würde ich weiter im DMX-Bereich arbeiten. Eigene DMX-Software bzw. Inhalte unter Absprache von Hendrik Hölscher schreiben.
Kein ATMEGA 8515 sondern etwas größeres mit mehr funktionen und Pins.

Ich lese mir nachher mal noch den Code durch.
Ich möchte eigentlich erstmal verstehen wie das mit den Stopbits usw ist.
( http://www.ulrichradig.de/home/index.php/avr/rs232-dmx - unten)
Wie empfange ich diese Bits?
Ich möchte erstmal eine Nebelmaschinen-Steuerplatine bauen. Dafür muss ich eine Pumpe steuern können (PWM kann ich ja :p) und Thermometer auslesen können, hierbei ist das Problem, dass Nebelmaschinen so bei 260-250°C arbeiten.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)