Forum: Mikrocontroller und Digitale Elektronik C Programm läuft nicht auf Atmega16


von Dd D. (neo120484)


Lesenswert?

Guten abend ich hoffe sehr ich mache mich hier jetzt nicht all zu
unbeliebt, aber alles lesen von Datenblättern tutorials und
forumsbeiträgen hat mir nicht wirklich weitergeholfen..

Erst mal vorweg, ich fange gerade erst an mich mit uC von Atmel
auseinander zu setzen .. Ich hab zwar ein gewisses Grundverständnis
durch prkatikas an der FH jedoch nicht wirklich den durchblick..


ich habe einen Atmega16 und das STK500 board zu hause diesen wollte ich
via ISP Interface programmieren .. das klappt auch wunder bar
jendenfalls sagt er mir das er es auf das flash geladen hat und wenn
ich es auslese steht da auch was drinnen..

zum anfang wollte ich eigenlich nur mal 2 led' leuchten lassen..

dazu hab ich die zugehörigen headerdateien includiert
also die avr/io oder wie sie heißt ( programm ist auf meinem ander PC)

das Datenrichtungsregister meines Port D also PD0-PD7 auf ausgang
gestellt und dann mit PORTD = (1<<2); die eins um 2 nach links
geshiftet..

soweit so gut das ganze dann in einer endlosschleife hängen lassen..

jedoch leuchten zwar led's aber ers mal die falschen und zudem
leuchten die immer egal ob ich den uC lösche oder nicht.. die
restlichen led's glimmen leicht was mich auch nicht gerade fröhlich
stimmt..

so das zu meinen Anfängen wäre nett wenn mir jemand weiter helfen
könnte.. ach ja an der fuses und dem Lockbits hab ich nichts verändert
die sind noch werksseitig eingestellt die frequenz des Oszillators hab
ich auf ein paar kHz (50 oder so ist ja vorgegeben)im AVR studio
eingestellt..

danke für eure mühen
gruß Dominik

von Ronny F. (ronny)


Lesenswert?

Zunächst:

Prüf bitte mal nach,ob der PortD auf dem STK500 auch wirklich mit den
LEDs verbunden ist.

Die Zeile

PORTD = (1<<2);   // 1<<2 = 4 = 100b

schaltet nur eine einzige LED AUS,da wenn ich mich Recht erinner auf
dem STK die LEDs Low-Aktiv angebunden sind.Der Rest sollte dann mit
voller Helligkeit leuchten.

Wie sieht der komplette Code aus?Hast du den mal mit einem AVR-Tutorial
verglichen?Das mit der LED ist eine Standartübung,da sollte es gute
Beispiele für geben.Gruss,

Ronny

von Jansen (Gast)


Lesenswert?

wie wäre es mal den code zu posten?

ja ich weiss, anderer rechner...aber wie soll man so bitte mal schnell
weiterhelfen.

von Wolfram (Gast)


Lesenswert?

Schau mal in den Schaltplan,des STK500
Die LED's sind lowaktiv, ich gehe mal davon aus dein Programm ist
richtig, da ich sehr vermute das du keine Pause zwischen den Schifts
machst, hast du da eine sehr hohe Frequenz (möglicherweise ist das das
glimmen? hänge es doch einfach mal an den Oszi und schau dir die
Signale an.
Wenn du an den Fuses nichts geändert hast läuft der Atmel mit internen
Takt 1 MHz und deine Frequenz von ein paar Kiloherz bei der 50
vorgegeben sind dürfte die ISP Frequenz sein, das ist die Frequenz mit
der sich STK500 und Mikrocontroller unterhalten wenn der
Mikrocontroller programmiert wird, nicht deine Taktfrequenz!
Zum STK500 gibt es auch ein Bsp.programm zum LED leuchten lassen.

von Dd D. (neo120484)


Lesenswert?

danke für eure antworten und sorry das ich das prog gestern nicht mehr
geposted hab ich hatte heute eine wichtige Prüfung..

Jedenfalls hab ich mal einen anderen uC genommen und es funktioniert
einwandfrei scheint also der uC ein spinner zu haben..

thx
Dominik

von Dd D. (neo120484)


Lesenswert?

Leider scheint es doch nicht so zu funktionieren wie ich dachte also hab
eigentlich immer noch das problem das die LED an Port PB1 Leuchtet trozt
 auskommentierens.



Hier mal mein quelltext:

//------------------------------------Includes-------------------------- 
---------
#include <avr/io.h>
#include <stdint.h>
#include <compat\ina90.h>
//------------------------------------Defines--------------------------- 
---------
#define FOSC 3686400
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1


//------------------------------------Functions------------------------- 
---------
//=============Init function
void USART_INIT(unsigned int ubrr)
{
  //Set Bautrate
  UBRR0H =(unsigned char)(ubrr<<8);
  UBRR0L =(unsigned char)ubrr;

  //Enable receive and transive
  UCSR0B = (1<<RXEN0) | (1 << TXEN0);

  //Set Frame format
  UCSR0C = (1<<USBS0)|(1<<UCSZ00);
}


//=============Send function
void USART_Transmit(unsigned char data)
{
  //Wait for empty Register
  while(!(UCSR0A &(1<<UDRE0)));

  //Send data
  UDR0 = data;
}


//=============Delay function
void delay_ms( unsigned int ms )
{
    unsigned int  i;
    unsigned int  j;

    for ( i = ms;  i;  i-- )
    {
        for ( j = 51;  j;  j-- )
        {
        }
    }
}






int main(void)
{
//  PORTB = 0xff;
//  DDRB  = (1<<1);

//  PORTB = (0<<2);
//      delay_ms(100);
//  PORTB = (1<<2);



  USART_INIT(MYUBRR);

  while(1)
  {
    USART_Transmit('a');
  //  PORTB = (0<<2);
        //      delay_ms(100);
  //  PORTB = (1<<2);
  }

}

wäre nett wenn mir da jemand weiter helfen könnte eigentlich soll die
LED nur als kontrollinformation dienen..

gruß Dominik

von Dd D. (neo120484)


Lesenswert?

update...

sehr mystriös finde ich auch das 3 Pins von Port B auf low gehen wenn
ich zwischen fuses und lockbits hin und her wechsle am rechner..also
nur   wenn ich mit der maus zwischen den 2 karteikarten hin und her
wechsle..

und sobald ich mit dem DDRB die pins als Ausgang definiern leuchte die
LED`s egal was oder wie ich es auf Port B

von Miszou M. (mize)


Lesenswert?

Hi

find ich nicht, irgendwie müssen die Daten auch aus dem Controller
gelesen werden und da deine ISP Pins auf dem PortB liegen, kann es
schon mal vorkommen das etwas komisches während dem Schreiben oder
Lesen vom Controller geschieht.

Zu deinem Ports:
DDRB steht "1" also Pin1 auf Ausgang, der Rest ist Eingang mit
aktivierten Pull Up.
Aber ein und ausschalten tust du Pin2, der ist aber ein Eingang.

Gruß MISZOU

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.