mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit ATmega162


Autor: Dominik Boine (dominik123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
versuche jetzt schon seit ca. 3 Tagen den ATmega162 zum laufen zu 
bringen aber er will einfach nicht. Ich verwende das AVR Studio v4.13 
mit dem STK500 tool und einem JTAG ICE MK2.
Ich habe zum Test zwei Programme geschrieben 1x in C und 1x in Assembler 
beide Programme schalten PortC Pin1 auf HIGH und wieder auf LOW.
Das Brennen des Controllers Funktioniert, zumindest sagt mir das der 
STK500.

Setting device parameters.. OK!
Entering programming mode.. OK!
etc...

Diese Meldungen kommen beim JTAG-Mode sowie auch beim ISP-Mode, alles 
OK.
Aber wenn ich das STK500 Fenster schliesse dann lieget am PortC Pin1 
eine Permanente Spannung von ca. 2,3V an, es sollte aber zwischen 5V und 
0V wechseln (denke mal das der Controller Steht!!! aber warum ????).
Die Fuses sind so gesetzt: - Brown-out disabeld
                           - JTAG Interface Enabeld
                           - SPI prog download Enabeld
                           - Boot Flash size 512
                           - Int RC Osc [CKSEL=0010 SUT=10]
                             auch Externe 6MHz und 16 MHz getestet

Es Funktioniert auch den Quelltext auf dem Controller im JTAG-Modus zu 
Debuggen. Bekommt der Controller den Takt über das Programmiergerät im 
Debug-Modus? Ich kann jede hilfe gut gebrauchen.


Danke im voraus Gruß
Dome



PS: hier noch mal die beiden Quelltexte.

Quelltext C:
#include <avr/io.h>
int main (void){
  DDRC=0xff;
  PORTC=0x00;
  int wert01;
  int wert02;
while(1) {
  for(wert01 = 0; wert01 <= 10; wert01++){
  PORTC=0x01;
  }
  for(wert02 = 0; wert02 <= 10; wert02++){
  PORTC=0x00;
  }
 }//end_while(1)
}//end_main


Quelltext ASM:
.include "m162def.inc"

        ldi r16, LOW(RAMEND)
        out SPL, r16
        ldi r16, HIGH(RAMEND)
        out SPH, r16
//-------------------------
ldi r16,0xFF
out ddrc,r16

AN0:
ldi r18,0x00
AN:
ldi r16,0x01
out portc,r16
inc r18
cpi r18,0x0F
brne AN

ldi r18,0x00

AUS:
ldi r16,0x00
out portc,r16
inc r18
cpi r18,0x0F
brne AUS
breq AN0

Autor: Peter P. (bonsaibaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie schnell läuft denn dein Controller ?

lg
  Peter

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber wenn ich das STK500 Fenster schliesse dann lieget am PortC Pin1
>eine Permanente Spannung von ca. 2,3V an, es sollte aber zwischen 5V und

Sieht doch korrekt aus:
while(1) {
  for(wert01 = 0; wert01 <= 10; wert01++) PORTC=0x01;
  for(wert02 = 0; wert02 <= 10; wert02++) PORTC=0x00;
 }//end_while(1)

Du schaltest hier innerhalb weniger µs zwischen High und Low um - wenn 
du jetzt noch mit einem trägen Multimeter misst kommt da (0 V + 5 V) / 2 
= 2,5 V raus.

Verwende zum Warten mal delay_ms() (oder so) oder miss mit einem 
Oszilloskop nach.

Gruß
Kai

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>- JTAG Interface Enabeld

Das ist der Fehler.
Guck mal im Datenblatt, wo der JTAG-Port sitzt und wie man den im 
Programm abschaltet.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das ist der Fehler.
>Guck mal im Datenblatt, wo der JTAG-Port sitzt und wie man den im
>Programm abschaltet.

PC0 hat doch nichts mit dem JTAG zu tun, oder?
http://www.atmel.com/dyn/resources/prod_documents/...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PC0 hat doch nichts mit dem JTAG zu tun, oder?

Ja, nee... War die typische Vermutung.
Das Programm wird trotzdem etwas schnell laufen, um einen Pegelwechsel 
zu erkennen, wenn man nur ein Multimeter besitzt.
Wenn man aber den JTAG ICE als Emulator benutzt und das Programm im 
AVRStudio per Einzelschritt durchtickert, sollte man schon noch was 
sehen.

Autor: Dominik Boine (dominik123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Schnellen Antworten.

1. "wie schnell läuft denn dein Controller ?
    Wenn der Controller mit dem Internen Quarz arbeitet sind es 8MHz.

2. "Verwende zum Warten mal delay_ms() (oder so) oder miss mit einem
    Oszilloskop nach."
    Habe mal mit einem Oszilloskop gemessen ca. 2,3V DC. Des Weiteren 
habe
    ich die zählerwerte weiter rauf gesetzt.

3. "Das ist der Fehler. Guck mal im Datenblatt, wo der JTAG-Port sitzt
    und wie man den im Programm abschaltet."
    Warum sollte ich denn diesen Port abschalten? Es ist möglich in den
    Fuses (JTAG Interface Disabeld) JTAG Programmierung abzuschalten.

4. "PC0 hat doch nichts mit dem JTAG zu tun, oder?"
    Nein PC0 ist nur Port C Pin 0.

5. "Wenn man aber den JTAG ICE als Emulator benutzt und das Programm im
    AVRStudio per Einzelschritt durchtickert, sollte man schon noch was
    sehen."
    Habe im Einzelschritt mit einem Multimeter und mit einem Oszilloskop
    gemessen 5V/0V. Das geht alles aber nicht wenn ich den Quelltext in
    den Controller Brenne.

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

Bewertung
0 lesenswert
nicht lesenswert
> 2. "Verwende zum Warten mal delay_ms() (oder so) oder miss mit einem
>     Oszilloskop nach."
>     Habe mal mit einem Oszilloskop gemessen ca. 2,3V DC. Des Weiteren
>     habe ich die zählerwerte weiter rauf gesetzt.

Das kommt jetzt auf die Zählerwerte an, aber wenn du da nicht in
die Millionen gegangen bist (*), dann wechselt der Pin sehr schnell
zwischen 0 und 1. Daher auch die Messwerte.

Probier mal das hier
#define F_CPU 8000000

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

void wait()
{
  unsigned char i;

  for( i = 0; i < 100; ++i )
    delay_ms( 10 );
}

int main()
{
  DDRC  = 0xff;
  PORTC = 0x00;

  while(1) {

    PORTC = 0x01;
    Wait();

    PORTC = 0x00;
    Wait();
  } //end_while(1)
} //end_main

Das sollte deine LED an PC0 im Sekundentakt aufblinken lassen.
Damit kannst du auch gleichzeitig überprüfen, ob dein µC tatsächlich
auf 8Mhz läuft.

Autor: Dominik Boine (dominik123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Endlich ich habe den µC am Laufen ^^.
Es hatten sich 2 Fehler eingeschlichen zum einem in den Fuses und zum 
anderen in der Software.

Alt:
#include <avr/io.h>
int main (void){
  DDRC=0xff;
  PORTC=0x00;
  int wert01;
  int wert02;
while(1) {                     <= Die While Bedingung mochte er nicht!
  for(wert01 = 0; wert01 <= 10; wert01++){<=10 war definitiv zu klein!
  PORTC=0x01;
  }
  for(wert02 = 0; wert02 <= 10; wert02++){
  PORTC=0x00;
  }
 }//end_while(1)
}//end_main

Neu:
#include <avr/io.h>
int main (void)
{
  DDRC=0xff;
  PORTC=0x00;
  long wert;
do
{
  wert = 0;
  while(wert < 50000)
  {
    PORTC=0x01;
    wert++;
  }
  wert = 0;
  while(wert < 50000)
  {
    PORTC=0x00;
  wert++;
  }
 }while(1); //end_while(1)
}//end_main


Gruß
Dome

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.