Forum: Mikrocontroller und Digitale Elektronik Problem mit ATmega162


von Dominik B. (dominik123)


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

von Peter P. (bonsaibaum)


Lesenswert?

Hallo,

wie schnell läuft denn dein Controller ?

lg
  Peter

von Kai G. (runtimeterror)


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:
1
while(1) {
2
  for(wert01 = 0; wert01 <= 10; wert01++) PORTC=0x01;
3
  for(wert02 = 0; wert02 <= 10; wert02++) PORTC=0x00;
4
 }//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

von STK500-Besitzer (Gast)


Lesenswert?

>- JTAG Interface Enabeld

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

von Kai G. (runtimeterror)


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/doc2513.pdf

von STK500-Besitzer (Gast)


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.

von Dominik B. (dominik123)


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.

von Karl H. (kbuchegg)


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
1
#define F_CPU 8000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
void wait()
7
{
8
  unsigned char i;
9
10
  for( i = 0; i < 100; ++i )
11
    delay_ms( 10 );
12
}
13
14
int main()
15
{
16
  DDRC  = 0xff;
17
  PORTC = 0x00;
18
19
  while(1) {
20
21
    PORTC = 0x01;
22
    Wait();
23
24
    PORTC = 0x00;
25
    Wait();
26
  } //end_while(1)
27
} //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.

von Dominik B. (dominik123)


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

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.