www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 spinnt


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mir ein Lauflicht programmiert.

Nur ist das Problem, dass er nur, dass das Licht nur in eine Richtung 
läuft und nicht mehr zurück. Am PC hat die Simulation funktioniert.

Ich bin wegen dem Atmega16 verwirrt: bedeutet am PORTx: -5V -> 1
                                                       0V -> 0

                                   oder:               5V -> 1
                                                       0V -> 0
#include <io.h>


int main (void)
{
  uint16_t i, j, k,l,m,n;
 

 DDRB = 0xff;

 
while(1)
 {
   //PORTB = 0x00;
  
  for( i = 0; i < 9; i = i +1) //Abzählen der Ports aufwärts

  {PORTB = _BV(i);


  for(j=0; j < 5000; j = j+1)
     for(k=0; k < 2; k = k+1);  //Abwarten

  }


 for( l = 9; l > 0; l = l -1) //Abzählen der Ports abwärts

  {PORTB = _BV(l);


  for(m=0; m < 5000; m = m+1)
     for(n=0; n < 2; n = n+1);  //Abwarten

  }





 
   
  }
  return 1;
}   // funktioniert auch


Mfg Daniel

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

na - +5V ist "1" aber ob die LED leuchtet, kommt darauf an
wie sie angeschlossen ist...

Gruß Otto

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja die Leds leuchten, aber warum nur einmal in eine Richtung und nie 
wieder?

Mfg daniel

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine Schleife hast
  for( i = 0; i < 9; i = i +1) //Abzählen der Ports aufwärts
  {
    PORTB = _BV(i);
  }

dann nimmt i nacheinander die Werte
0, 1, 2, 3, 4, 5, 6, 7, 8
an.
i wird zwar 9, aber danach wird abgefragt ob i < 9 ist.
Das ist nicht der Fall und daher wird die Schleife
beendet.

Hast du eine Schleife
 for( l = 9; l > 0; l = l -1) //Abzählen der Ports abwärts
 {
   PORTB = _BV(l);
 }

dann nimmt l nacheinander die Werte
9, 8, 7, 6, 5, 4, 3, 2, 1
an.
Danach wird l durch die Subtraktion zu 0. Die darauf folgende
Abfrage l > 0 ergibt false und die Schleife wird beendet.

Aber: Es gibt kein Bit 9 am Port. Die Bits sind von 0 bis
8 durchnummeriert.




Autor: Blinder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm,

Wieviel Bits haben deine Bytes ?

gruß,
Bjoern

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit 9 war nur ein Versuch.

Das die Schleife beendet wird ist ja der sinn, dann danch soll die 
Schleife beginnen, die in die andere Richtung zählt. Wenn die aus ist, 
gibts ja die while(1) Schleife, die das ganze von neu laufen lässt.

Mfg Daniel

Autor: Blinder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, Karl Heinz war schneller.......

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> Das mit 9 war nur ein Versuch.
>
> Das die Schleife beendet wird ist ja der sinn, dann danch soll die
> Schleife beginnen, die in die andere Richtung zählt. Wenn die aus ist,
> gibts ja die while(1) Schleife, die das ganze von neu laufen lässt.
>

Ja, ist schon klar.
Was passiert statt dessen?
Beschreibe bitte genau, was statt dessen passiert

(sonst müsste ich dein Pgm in einen Prozessor brennen
und selbst nachsehen).


Autor: Blinder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich muessten Deine "Verzögerungschleifen" sich wegoptimieren.
Wahrscheinlich wird irgenetwas passieren, aber so schnell das Du nichts 
siehst.

gruß,
Bjoern

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

Bewertung
0 lesenswert
nicht lesenswert
Blinder wrote:
> Eigentlich muessten Deine "Verzögerungschleifen" sich wegoptimieren.
> Wahrscheinlich wird irgenetwas passieren, aber so schnell das Du nichts
> siehst.
>

Ist nicht ganz von der Hand zu weisen :-)
Wenn der Optimizer beim gcc aus ist, dann sollten die
Schleifen erhalten bleiben. Da Daniel noch neu ist, geh
ich mal davon aus, dass er den entsprechenden Schalter noch
nicht gefunden hat.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger

Er zählt nur in eine Richtung, das heißt, dass die Leds nur in eine 
Richtung nacheinander leuchten. Dann is aus und es tut sich nichts mehr.

Mfg Daniel

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

Bewertung
0 lesenswert
nicht lesenswert
Hmm.
So auf die Schnelle seh ich da allerdings auch nichts
schlimmes.

Probier mal diese Version
#include <avr/io.h>
#include <stdint.h>

int main (void)
{
  uint16_t i, j, k,l,m,n;

  DDRB = 0xff;

  while(1)
  {
    for( i = 0; i < 8; i = i +1) //Abzählen der Ports aufwärts
    {
      PORTB = _BV(i);

      for(j=0; j < 5000; j = j+1)
        for(k=0; k < 2; k = k+1)
          ;  //Abwarten
    }

    for( l = 7; l > 0; l = l -1) //Abzählen der Ports abwärts
    {
      PORTB = _BV(l);

      for(m=0; m < 5000; m = m+1)
        for(n=0; n < 2; n = n+1)
          ;  //Abwarten
    }
  }

  return 1;
}

(Du hast doch dein Programm mittels Cut&Paste hier eingefügt
und nicht neu eingetippt? Oder?)

Autor: Blinder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Knackpunkt ist wohl, laut Tutorial:


PORTB |= _BV(1)  SETZT  PortB.1
PORTB &= ~_BV(1) LÖSCHT PortB.1


gruß,
Bjoern

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

Bewertung
0 lesenswert
nicht lesenswert
Blinder wrote:
> Der Knackpunkt ist wohl, laut Tutorial:
>
>
> PORTB |= _BV(1)  SETZT  PortB.1
> PORTB &= ~_BV(1) LÖSCHT PortB.1
>
>
Nein, in dem Fall nicht.
Er weist dem Port immer komplett einen neuen Wert zu.
Das leidige Thema 'Einzelbitsetzen' ist es dadurch nicht.
Ich könnte mir höchstens vorstellen, dass beim
 _BV(a)
irgendetwas Grausliches passiert, wenn a ausserhalb des
zulässigen Bereichs 0 bis 7 liegt.

Ansonsten sehe ich nichts Schlimmes in dem Pgm
(ausser dass die #includes nicht gestimmt haben, daher
die Nachfrage nach dem Cut&Paste. Wenn Daniel abgetippt
hat, dann gäbe es theoretisch noch die Möglichkeit dass
er im echten Quelltext irgendwo l mit 1 (das ist: eL mit Eins)
verwechselt hat. l ist ein schlechter Variablenname, da er oft
von 1 nicht zu unterscheiden ist).

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich habs mit Cut&Paste eingefügt

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger

Ich habe dein Programm jetzt ausprobiert. Leider kommt es aufs gleiche 
hinaus. Das Licht lauft nur in eine Richtung.

Ich habe die Ausgänge jetzt nur so beschalten und mit dem Multimeter 
gemessen:
1 --> 3,02V
0 --> 0,92V

Ich glaube da stimmt etwas nicht.

Mfg Daniel

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> @ Karl heinz Buchegger
>
> Ich habe dein Programm jetzt ausprobiert. Leider kommt es aufs gleiche
> hinaus. Das Licht lauft nur in eine Richtung.

Habs grade in einen Mega16 gebrannt:
funktioniert.

>
> Ich habe die Ausgänge jetzt nur so beschalten und mit dem Multimeter
> gemessen:
> 1 --> 3,02V
> 0 --> 0,92V
>
> Ich glaube da stimmt etwas nicht.

Wie sind deine LED angeschlossen, bzw. welches Board hast du
überhaupt?
Welcher Compiler?

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn mit deinen Pins was nicht stimmen würde, dürften die Dioden beim 
Hochzählen auch nicht leuchten, oder?

Gruß Marcus

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

Die Leds wurden vor der Messung abgetrennt.
Ich verwende das STK500 Board.
Da die Leds auf dem invertiert sind, sind sie nicht zu gebrauchen.

Deswegen habe ich mir ein eigenes Led Board gebaut.

Wenn keine "Last" am Port ist, tut sich beim Lauflicht Programm nichts: 
Am Multimeter werden die 0,9 V gemessen.

Mfg Daniel

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> @  Karl heinz Buchegger
>
> Die Leds wurden vor der Messung abgetrennt.
> Ich verwende das STK500 Board.
> Da die Leds auf dem invertiert sind, sind sie nicht zu gebrauchen.

Warum nicht?
Alles was du tun musst, ist die Augabe vorher binär
umdrehen:

  PORTB = ~( _BV(i) );

und schon leuchtet nur die eine LED.

>
> Deswegen habe ich mir ein eigenes Led Board gebaut.
>
> Wenn keine "Last" am Port ist, tut sich beim Lauflicht Programm nichts:
> Am Multimeter werden die 0,9 V gemessen.

Das ist schlecht.
Da sollten entweder 0V oder 5V zu messen sein.
Wenn du da andere Werte hast, könntest du den Port
bereits geschossen haben.

Klemm mal deinen Aufbau ab und arbeite mit den original
STK500 LED.
Wenn du nichts am Pgm veränderst, wandert halt keine LED
sondern eine Lücke. Ist im Moment egal.

Wenns dich stört: Wie gesagt, der ~ Operator dreht sein
Argument bitmässig um: AUs 0 wird 1, aus 1 wird 0

  Aus        _BV(2)
  also       0b00000100
  wird dann  0b11111011

und damit leuchtet dann LED #2 und nur die.

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

Bewertung
0 lesenswert
nicht lesenswert
Nur um sicher zu gehen:

Klemm mal deinen Zubau ab, wenn du das nächste mal
per ISP programmierst. Beim Mega16 liegen die ISP
Pins am PORTB. Wenn dein Zubau nur brutal genug ist,
dann verhindert er die Neuprogrammierung und du führst
die ganze Zeit ein altes Programm aus.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

Ich habe den Zubau immer Abgeklemmt, wenn ich den uP Programmiert habe.

Ich habe das mit der Invertierung PORTB = ~( _BV(i) ); programmiert, 
aber jetzt leuchten einfach alles Leds auf den STK500 Board.

Ich habe zu dem Board einen Atmega8515 bekommen, und der hat Problemlos 
funktioniert.

Jetzt währe das der vierte Atmega16 der nicht in Ordnung ist.
 2 haben einen Flashspeicher Fehler
 1 hat irgendwas
 und derhier hat was mit den Ausgängen.

Ich weiß echt nicht was da nicht stimmt.

Mfg Daniel

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

Bewertung
0 lesenswert
nicht lesenswert
Das ist in der Tat eigenartig.
Ich kann aber nur eines sagen.
Das Pgm das ich gepostet habe, habe ich mit
gcc kompiliert und genau so in einen Mega16
der mit 8 Mhz läuft gebrannt.
Das Pgm funktioniert.


Versuch mal ein einfacheres Testprogramm

int main()
{
  DDRB = 0xFF;
  PORTB = 0x00;
}

jetzt sollten am STK500 alle Led ein sein.

int main()
{
  DDRB = 0xFF;
  PORTB = 0xFF;
}

jetzt sollten alle aus sein.

Wenn das nicht klappt, hast du entweder einen
Verschaltungsfehler am STK, oder aber der Mega
ist tatsächlich in die ewigen Jagdgründe übergetreten.

Anstatt PORTB würde ich auch mal PORTA oder PORTD
probieren.

Autor: Ein Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo..
Was bedeutet eigentlich ->_BV(2) ?

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

Bewertung
0 lesenswert
nicht lesenswert
BV steht für "Bit Value"

_BV(2) ist also ein Wert, in dem das Bit 2 gesetzt
ist. Realisiert ist das mit einem Makro.

_BV(2) ist identisch zu 0x00000100
die 'ohne Makro'-Standard C-Schreibweise dafür
würde lauten:
  1<<2

Ohne jetzt das Makro zu kennen, würde ich mal
sagen, das _BV so implementiert ist

#define _BV(x) ( 1 << (x) )

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

Bei:

  DDRB = 0xFF;
  PORTB = 0x00;

haben wirklich alle Leds geleuchtet.

Bei:

  DDRB = 0xFF;
  PORTB = 0xFF;

haben die Leds bischen schwächer geleuchtet.

Mfg Daniel

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

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
>
>   DDRB = 0xFF;
>   PORTB = 0xFF;
>
> haben die Leds bischen schwächer geleuchtet.

Bischen schwächer ist schlecht.
Die sollten ratzeputz aus sein.

Was ist auf einem anderen Port?

int main()
{
  DDRD = 0xFF;
  PORTD = 0xFF;
}

gehen sie da (am Port D) noch aus?

Hintergrund: Es scheint wohl so zu sein, dass der Mega16
nur noch Schrott ist. Um aber voreiligen Schlüssen
vorzubeugen, kannst du mal abchecken, ob nur der
PORTB hinüber ist, oder ob es auch die anderen Ports
erwischt hat.

Allerdings sollte man sich jetzt mal Gedanken darüber
machen, warum der Mega geschrottet ist. Der macht das
ja nicht weil ihm fad war.


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

Die anderen PORTs haben ja auch was, bei PORTA leuchtet eine Led einfach 
nicht und bei PORTc tut sich überhaupt nichts.

Aber ich sag ja, der Atmega8515 funktioniert einwandfrei.

Den Atmega16 habe ich von Anfang an mit den board Leds betrieben, erst 
vor 2 Tagen habe ich mir das eigen Led Board gebaut.

Und schon von Anfang an haben die Leds etwas gehabt.

Mfg Daniel

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine, hat der Atmega16 was gehabt.

Autor: Ein Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 Karl heinz
Danke für die Auskunft.

C-Code funktioniert einwandfrei auf dem STK500 mit einem Tiny 2313.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

Ich werde mir jetzt noch einen Atmega16 kaufen.
Wo kaufst du die uP ein?

Mfg Daniel

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> Ich habe zu dem Board einen Atmega8515 bekommen, und der hat Problemlos
> funktioniert.
>
> Jetzt währe das der vierte Atmega16 der nicht in Ordnung ist.
>  2 haben einen Flashspeicher Fehler
>  1 hat irgendwas
>  und derhier hat was mit den Ausgängen.

Und Du bist sicher, dass Du im Brennprogramm des AVR-Studios den 
richtigen Controllertyp ausgewählt hast?

Ich hatte letztens das Problem, dass sich diese Einstellung ohne mein 
Zutun verändert hatte, statt des (von mir eingestellten) Mega8535 war 
auf einmal ein ganz anderer Typ eingestellt. Da die Typen 
unterschiedlich große Pagen haben gibt es da Ärger.

Desweiteren besteht bei Austausch des Mega8515 und Mega16 noch die 
Gefahr, den falschen Sockel des STK500 zu benutzen, denn die Typen sind 
nicht pinkompatibel.

...

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hannes Lux

Ein freund von mir hat genau das Board mit dem Atmega16 verwendet und 
alles hat problemlos fuktioniert.

Bei den EInstellungen habe ich schon oft nachgeschaut, da stimmt alles.

Mfg Daniel

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> @ Hannes Lux
>
> Ein freund von mir hat genau das Board mit dem Atmega16 verwendet und
> alles hat problemlos fuktioniert.
>
> Bei den EInstellungen habe ich schon oft nachgeschaut, da stimmt alles.
>
> Mfg Daniel

- Reden wir immer noch vom STK500?

- Ist Dir klar, dass der Mega16 nicht in den Sockel gehört, in dem der
  Mega8515 war?

...

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> @  Karl heinz Buchegger
>
> Die anderen PORTs haben ja auch was, bei PORTA leuchtet eine Led einfach
> nicht und bei PORTc tut sich überhaupt nichts.

...beim M16 sind auf Port C die JTAG-Anschlüsse per Default aktiviert. 
Wenn man die per ISP nicht ausschaltet geht der halbe Port "nicht 
richtig".

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Hannes Lux

Auf welchen Sockel gehört dann der Atmega16 auf dem STK500?

Die JTAG_Anschlüsse sind abgeschaltet.

Mfg Daniel

Autor: Lock Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SCKT3100A3 Red 3

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> @  Hannes Lux
>
> Auf welchen Sockel gehört dann der Atmega16 auf dem STK500?

Auf den, der dafür vorgesehen ist. Wozu gibt es eigentlich ein Handbuch 
zum STK500??? - Falls das verlegt sein sollte, findet man diese Info 
auch in der Hilfe zum AVR-Studio. Warum liest Du die denn nicht???

>
> Die JTAG_Anschlüsse sind abgeschaltet.
>
> Mfg Daniel

MfG und viel Erfolg,
Hannes

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Hannes Lux


Vielen vielen Dank

Der ATmega16 war wirklich im falschen Sockel.

Habe es erst jetzt bemerkt.

Mfg Daniel

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.