www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit C Programm


Autor: Alien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

um es vorweg zu nehmen, ich bin relativ neu auf dem Gebiet 
Mikrocontroller und C... Momentan schreibe ich an einer Uhr, das hat 
auch alles bisher wunderbar geklappt.
Die Ausgabe hat auch schon geklappt, jetzt habe ich allerdings noch 
versucht einen Teil einzubauen, seither wird aber nichts mehr 
dargestellt auf den Ausgängen auch nich wenn ich auf den alten Zustand 
zurückgeh. Ich habe extra noch ein anders Programm zum Ausgänge testen 
gemacht, un die funktionieren noch alle.

Den Code häng ich jetzt mal an.


#include <avr/io.h>
#include <stdint.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>


// CTC Funktionalität herstellen Clear on Compare/Match

#define t1ctc 0x04
#define t0ctc 0x01

// Maskierung das nur der TIMSK Teil von Timer 1 geändert wird

#define t1mask 0b00111100


//Maskierung für TIMSK von Timer0

#define t0mask 0b00000011


//Vorladewert da Timer 1ms darstellen soll

#define t0vor  124    // -1 weil bei 0 angefangen wird zu zählen

//CTC Vektor von Timer 0

#define ctc_vek_t0 TIMER0_COMP_vect


//Variablendefinition

volatile uint16_t millisek;
volatile uint8_t sek;
volatile uint8_t min,std;

//Funktionsdefinition

void timer0_config(void)
{

TCCR0 = (0b00000011 & 0b00000111);   // Prescaler von 64 daraus ergibt sich 8000000/64=125000

OCR0  =  t0vor;   // t0 vor = 124 d.h. bei jedem erreichen von t0vor wird das Interrupt flag des ISR Vectors gesetzt (8000000/64)/f(1000Hz) =125


TIMSK = (t0ctc & t0mask);      // CTC Funktionen herstellen



}


void main(void)
{
//Datenrichtungsregister

DDRA=0xFF;
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xF8;  //Port D 0-2 als Eingang alle anderen Ausgang für Darstellung der Uhrzeit mit LED's


//Interruptroutine

timer0_config();

sei();

while(1)
{
/* uint8_t set; //auskommentiert da Funktion momentan nicht gegeben, und ohne Switch war Funktion vorhanden, jetzt nicht mehr.

set=PORTD;

switch(set)
{
case 3:
{
min++;
PORTB=min;
}

case 5:
{
std++;
PORTA=std;
}

default:
{
*/
PORTA=std;
PORTB=min;
PORTC=sek;
//}

//}
}

}


ISR(TIMER0_COMP_vect)
{
millisek=millisek+1; //Alternativ millisek++

if(millisek==1000)
{
sek++;
millisek=0;
}
if(sek==60)
{
min++;
sek=0;
}

if(min==60)
{
std++;
min=0;
if(std==24)
{
std=0;
}
}
}


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> TCCR0 = (0b00000011 & 0b00000111);

wie kommst man denn auf soetwas, was erwartest du dir davon?

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht gehts nicht weil du die "break;"'s in der Switch-Anweisung 
vergessen hast.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alien schrieb:
> /* uint8_t set; //auskommentiert da Funktion momentan nicht gegeben, und ohne 
Switch war Funktion vorhanden, jetzt nicht mehr.
>
> set=PORTD;

Wenn du damit die Taster einlesen willst, ist das falsch.
Das geht mit PIND.
:-)

Autor: Alien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> wie kommst man denn auf soetwas, was erwartest du dir davon?

das war einfach für mich eine gedankenstütze welche Pins in dem Register 
überhaupt dazu gehören, sozusagen als "Sicherheit"

Habe jetzt die Breaks eingefügt und das ganze auch auf PIND abgeändert.

Aber momentan immernoch ohne Erfolg, leider. :(

Weiß noch jemand Rat?

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal das "#include <avr/iom16.h>" raus, die wird eh durch io.h 
eingebunden, steht auch in der Quelle:
/* This file should only be included from <avr/io.h>, never directly. */

Welchen AVR hast du? Ist er auch richtig beim Compiler/AVR Studio 
eingestellt?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit deinem unübersichtlichen Bitgemurkse setzst du in TIMSK
das unterste Bit.
Dadurch wird ggf. ein Overflow-Interrupt ausgelöst. Den hast du aber
gar nicht definiert, sondern den Compare-Interrupt.
Also wird regelmäßig ein Reset ausgelöst.

Vorschlag: sauber neu schreiben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:

> Vorschlag: sauber neu schreiben.

Das war auch mein erster Gedanke.
Das ist klassischer Code mit dem man sich selber austrickst.
Schmeiss als erster die ganzen #define raus und schreib das sauber.

Sowas
#define t1ctc 0x04
#define t0ctc 0x01

...

#define t0mask 0b00000011

....

TIMSK = (t0ctc & t0mask);      // CTC Funktionen herstellen
hat nur einen Zweck: maximale Konfusion zu erzeugen. Und zwar bei dir 
genaus wie bei deinen Lesern.

Und rück deinen Code ein!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.