PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger Meine Schaltung macht merkwürdige Sachen



The KOR
09.05.2008, 19:34
Hi Leute,
ich habe mit einem AT Mega 8 angefangen zu programmieren. Und den auf meinem STK500 mit nem kleinen Lauflicht beschrieben funktioniert auch wunderbar auf dem STK500.
Jetzt dachte ich mir ich habe ja noch meinen alten Kosmos Elektronik Kasten, da könnt man sich doch mal schnell^^ nen Adapter machen. Ich habe mir die Schaltung aus eurem einsteiger Tutorial vorgenommen Stromversorgung Quarz und 100K Widerstand IC sockel drauf. Die Freien Pins mit nägel Verbunden und rauf auf den Kosmos Kasten. (Schaltplan im Anhang die Freien pins gehen auf die erwähnten nägel)
Das Problem auf dem Kosmos Kasten Funktioniert es nicht mehr die Stromversogung Funktionier(5,02V laut Multi) Er shaltet auch die Leds die ich einfach auf dem Kosmos XN3000 gesteckt habe, aber er schaltet an und anstatt aus auf halbe kraft. Und auch sonst gibt er teilweise recht merkwürdige laufreinfolgen von sich.
Hat jemand ne Idee woran es liegen könnte.
Vielen Dank

PicNick
09.05.2008, 19:52
Wie sind denn die LED angeschlossen ? Die Schaltung sieht ja unverdächtig aus. Kontakfehler etc. sieht man natürlich nicht und ich würde aber in diese Richtung vermuten.

oZe
09.05.2008, 20:16
Also ich würde auch mal stark auf ein Hardware Problem tippen. Eventuell läuft ein Krichstrom in deinem Steckbrett o.ä.
Um sicher zu gehen würde ich aber trotzdem gerne mal die Software sehen oder ist das 1:1 die gleiche wie im tutuorial?

The KOR
09.05.2008, 20:46
Nein Das Programm ist ein ganz anderes (selbst geschrieben). Aber ich habs ja auf dem STK500 Ausprobiert Und da läuft es ohne probleme. Der Kosmos kasten ist in Punkto verbindungen immer eins A gelaufen und ich habe die leds und schalter alle einzeln ausprobiert.
Die LEDs sind mit 470Ohmwiederstnden an den Adapter gebunden und dann zurück auf GND.
Am Kosmos kasten kanns nicht liegen. Der IC lauft auf dem STK500(vor und nachher. Nur mit Adapter macht er werkwürdige Sachen.
Hier der Code:


#include <avr/io.h> // (1)
#ifndef F_CPU
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
(z.B. durch Übergabe als Parameter zum Compiler innerhalb
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
"nachträgliche" Definition hinweist */
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */
#endif
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */



void long_delay(uint16_t ms) {
for(; ms>0; ms--) _delay_ms(1);
}

void knightrider (void)
{
DDRD = 0x00;
DDRD = 0xff; // Port b alle pins auf ausgang
PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );

DDRB=0; //set all PartB to input


PORTD ^= ( 1 << PD0 );

while(bit_is_set(PINB,0)) {
long_delay(30);
PORTD ^= ( 1 << PD1 );
long_delay(30);
PORTD ^= ( 1 << PD2 );
long_delay(30);
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD0 );
long_delay(30);
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD1 );
long_delay(30);
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD2 );
long_delay(30);
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD3 );
long_delay(30);
PORTD ^= ( 1 << PD7 );
PORTD ^= ( 1 << PD4 );
long_delay(30);
PORTD ^= ( 1 << PD5 );
long_delay(30);
PORTD ^= ( 1 << PD6 );
long_delay(30);
PORTD ^= ( 1 << PD5 );
long_delay(30);
PORTD ^= ( 1 << PD6 );
long_delay(30);
PORTD ^= ( 1 << PD7 );
PORTD ^= ( 1 << PD4 );
long_delay(30);
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD3 );
long_delay(30);
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD2 );
long_delay(30);
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD1 );
long_delay(30);
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD0 );
long_delay(30);
PORTD ^= ( 1 << PD2 );
long_delay(30);
PORTD ^= ( 1 << PD1 );
}
PORTD ^= ( 1 << PD0 );
}

void blink()
{
DDRD =0x00;
DDRD =0xff; // Port b alle pins auf ausgang
PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//aus
long_delay(200);
PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//an
long_delay(50);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//aus
long_delay(40);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//an
long_delay(30);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//aus
long_delay(20);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//an
long_delay(10);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//aus
long_delay(10);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//an
long_delay(10);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//aus
long_delay(10);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//an
long_delay(500);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );//aus
DDRD =0x00;
}

void boot()
{
DDRD =0x00;
DDRD =0xff; // Port b alle pins auf ausgang
PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );

PORTD ^= ( 1 << PD0 );
long_delay(100);
PORTD ^= ( 1 << PD1 );
long_delay(100);
PORTD ^= ( 1 << PD2 );
long_delay(100);
PORTD ^= ( 1 << PD3 );
long_delay(100);
PORTD ^= ( 1 << PD4 );
long_delay(100);
PORTD ^= ( 1 << PD5 );
long_delay(100);
PORTD ^= ( 1 << PD6 );
long_delay(100);
PORTD ^= ( 1 << PD7 );
long_delay(500);

PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );



}

int main( void )
{
boot();
blink();
DDRD=0;
while(1)
{
if (bit_is_clear(PINB, 1))
{
knightrider();
}
if (bit_is_clear(PINB, 2))
{
blink();
}
if (bit_is_clear(PINB, 3))
{
boot();
}
}
return 0;
}


könnte es daran liegen das ich jetzt einen Quarz drinnhabe den ich vorher nicht drinn hatte.(und nicht ins programm geschrieben habe)
Das Layout häng ich auch noch mit dran. die Lötpunkte außen gehen an die nägel. Oben links ist minus rechts Plus.
Die Teile von oben nach unten sind:
Elko 470µF
keramikkondensator 100nf(hatte nur noch zwei der obere fehlt)
7805
keramikkondensator 100nf
100k Widerstand
IC Sockel
Quarz 16MHz
zwei Keramik kondensatoren 22pF

Der Pin unter minus ist ne 5V+ Stromzufuhr.

Besserwessi
09.05.2008, 22:14
Wenn der Quarz nicht benutzt wird, sollte er auch keine Probleme machen. Ein quarz auf einem Testbrett ist sonst problematisch, wenn er gebraucht wird.

Der Fehlende 100 nF Kondensator kann dagegen Probleme machen. Mindestens 2 sind nötig: einer vor dem Spannungsregler, dicht am Regler und einer hinter dem Spannungsregler und dicht an den GND/VCC Pins.

Im Ideal fall sollte man 4 Kondensatoren haben: je einer dicht an GND/VCC und AGND/AVCC sowie vor und hinter dem Regler.

Wenn die LEDs mit der richtigen Frequenz blinken (auch wenn sie nicht ganz ausgehen) sollte das Programm ja immerhin laufen. Es könnte sein das der Regler schwingt, und nur im Mittel die 5 V Stimmen.

The KOR
10.05.2008, 00:48
Ich werde dann am Dienstag mal mich auf die Suche nach noch nem dritten 100nf machen. zwischen AGND und AVCC hab ich in der Grundschaltung keinen Kondensator gesehen
den brauch man doch hoffentlich nicht unbedingt?
Wenn man ihn verbaut muss es auch wieder ein 100nF sein?

kolisson
10.05.2008, 04:02
vielleicht ein masse-fehler ?
gruss klaus

The KOR
10.05.2008, 08:51
sry ich bin nicht so ein elektronik profi was ist denn ein masse fehler?

kolisson
10.05.2008, 12:19
ich meinte, dass die minus-verbindung zwischen den beiden schaltungen nicht gut genug funktioniert. sowas könnte zumindest sein , da sowas sehr merkwürdige effekte erzeugt.

gruss

PicNick
10.05.2008, 15:32
Das ist erstmal nicht so wichtig, aaaaaber statt


PORTD ^= ( 1 << PD0 );
PORTD ^= ( 1 << PD1 );
PORTD ^= ( 1 << PD2 );
PORTD ^= ( 1 << PD3 );
PORTD ^= ( 1 << PD4 );
PORTD ^= ( 1 << PD5 );
PORTD ^= ( 1 << PD6 );
PORTD ^= ( 1 << PD7 );

solltest du schreiben


PORTD ^= 0xFF;

The KOR
11.05.2008, 14:06
^^ ja würde einfacher sein. gibt es noch einen einfacheren weg die einzelnen pins zu schalten als mit z.B.: PORTD ^= ( 1 << PD7 );
Und meine zweite frage: kann man die pins auch von 0 auf 5V stufenlos regeln oder gibt es nur ein aus?

oZe
11.05.2008, 14:18
So von "Haus aus" kann der AtMega8 das nicht. Das ganze ist eben eine digitale geschichte und da geht eben nur 1 oder 0. Um z.b. 3V an den Ausgang zu legen kannst du höchsten mit einer Pulsweitenmodulation (PWM) erreichen. Das ist im Endeffekt nichts anderes als ein schnelles Ein- und Ausschalten des Ausgangs. Durch diesen Effekt kannst du quasi eine "durchschnittsspannung" am Ausgang erreichen. Lies dir dazu am besten mal den Artikel im Wiki durch.

Mfg

oZe