Test-Board für erste µC-Projekte korrekt?

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 10.01.11, 19:17

Hi,

ich hab mich hier jetzt im Forum angemeldet, weil ich jetzt auch endlich mal mit µC und LEDs was machen will. Bis jetzt belief es sich nur auf einfache Schaltungen ohne Extrafunktionen. Aber das soll sich jetzt ändern. Daher hab ich mir mal ein kleines Board gemacht, auf dem ich dann ein wenig mit Tastern und LEDs rumspielen will.

Daher die Bitte, ob ihr mal einen schweifenden Blick drüber werft, ob es soweit richtig ist.

Danke!


Edit: Reset angepasst!
Test.jpg
Zuletzt geändert von BlackHawk am Mi, 12.01.11, 18:01, insgesamt 3-mal geändert.
stromflo
Mega-User
Mega-User
Beiträge: 304
Registriert: Mi, 31.12.08, 12:16

Mo, 10.01.11, 20:21

Hi,

verwendest du tatsächlich den abgekündigten (alten) AT90S2313 oder den Attiny2313?

Den AT90S2313 habe ich nie verwendet, solltest du aber Attiny2313 verwenden würde ich folgendes noch ändern:

Reset mit Pullup (z.B. 10K) auf VCC ziehen. Ansonsten resetet der AVR ungewollt bzw. evtl. ständig.
Oft ist es da auch nutzvoll einen Taster mit einzubauen.

Ich würde Taster grundsätzlich nach GND schließen lassen, dann können die externen Pullups entfallen (außer beim Reset). Der AVR bringt interne Pullups mit die aktiviert werden können.

Den Transistor für die 20mA Leuchtdiode könntest du dir dann auch sparen, weil ein I/O beim Attiny2313 bis zu 40mA liefern kann. Gesamt gilt ein Grenzwert von maximal 200mA. Natürlich sind das die Maximum Ratings und man sollte stets drunter bleiben, 20mA sollten aber kein Problem sein.

Soweit so gut mal von mir, aber das gilt in erster Linie wie oben angemerkt für Attiny2313!

Gruß Flo
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 10.01.11, 20:29

Danke das mit dem Reset werd ich sofort ändern. Der Transistor is einfach nur da, dass ich nen Transisor mittels µC ansteuere, um auch damit Erfahrung zu sammeln. Also weniger weil den Strom verstärken will!

Aber die Taster könnt ich auch so lassen? Denn mein kleines Hirn versteht das am Anfang meiner µC-Erfahrung so wesentlich besser, als wenn ich nach Ground schließe. Und außerdem liegen die Teile, außer den Tastern und Controller, eh hier rum! :wink:

Ich nehm den Attiny 2313!
stromflo
Mega-User
Mega-User
Beiträge: 304
Registriert: Mi, 31.12.08, 12:16

Mo, 10.01.11, 22:52

Sicher sollte das auch gehen, ist halt nur dann anders rum....
In deinem Fall wenn du Taster offen hast liegt 0V bzw. GND (Low) am AVR Eingang, wenn der Taster geschlossen wird lieght 5V (High) Potenzial am AVR Eingang an. Aber ich denke der Unterschied zwischen Pullup und Pulldown ist dir ja geläufig.Ich mags halt anders rum lieber, allein schon weil man eben den internen Nutzen kann.

Laut Datenblatt wird im übrigen beim Spannungsregler 7805 meist ein 330nF Kondensator am Eingang Empfohlen und am Ausgang ein 100nF. Was man dann auch noch machen sollte ist eine Diode vom Ausgang des Spannungsreglers (Anode) zum Eingang (Kathode). Eine 1N4001 sollte dafür z.B. gehen.

Hier noch nen Info Link dazu.

Zum Schaltplan es fehlt noch eine Junction.

Achja unbenutzte Pins würde ich auf Stfitleisten führen, dann kann man später noch was damit anfangen. Meist will man nach einem Blinklicht etc. dann auch noch mehr :)


Gruß Flo

PS: Wie immer alle Angaben ohne Gewähr :)
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 10.01.11, 23:04

Ok, wunderbar danke!

Hätte nich gedacht, dass da doch noch so viele "Fehler" drin sind. Aber danke für die Verbesserungen.

Zum 7805, da gibts auf mikrocontroller.net die Variante mit 100n sowohl am Eingang als auch am Ausgang, daher hatte ich dass dann auch so gemacht. Macht das denn einen großen Unterschied?

Und zu den unbelegten Pins, is ne gute Idee, die noch ma extra rauszuführen, daran hab ich jetzt gar nicht gedacht!
stromflo
Mega-User
Mega-User
Beiträge: 304
Registriert: Mi, 31.12.08, 12:16

Mo, 10.01.11, 23:12

Ich geh halt immer am liebsten nach dem Datenblatt, da macht man meist nix falsch :)
Naja Fehler waren ja nicht viele drin, eher noch Ergänzungen.

Gruß Flo
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 10.01.11, 23:14

naja, stimmt schon, der Hersteller wird sich ja schon was bei denken.

Aber dann kann ich demnächst richtig einsteiegn in die Marterie. Im Moment is keine Zeit dafür!
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

Di, 11.01.11, 12:40

Die 100 oder 330 nF am Eingang sind verzichtbar, dafür gehen 10 µF nur dann, wenn Du eine bereits gesiebte Gleichspannung vorliegen hast (davon ist allerings auszugehen, sonst hätteste Du ja einen Brückengleichter am Eingang gezeichnet, wenn auch Wechselspannung möglich sein soll, dann sollten es 100 µF bis 470 µF sein --- Spannungsfestigkeit ca. 1,5fach der RMS-Wechselspannung)

Die 100 nF am Ausgang des 7805 sind jedoch unverzichtbar!

Das übrige: schließe mich da den anderen an: warum mehr Bauteile als nötig?

Meine Empfehlung ATMega88 (ob V, P, PA oder sonstwas hinten dran ist egal, PA ist das aktuelle Modell, das als einziges noch hergestellt wird und vermutlich auch noch relativ lange hergestellt werden wird, die sind aber alle kompatibel)

(PA löst alle anderen ab und bieten in einem Bauteil die bisher getrennten Spannungs- und Frequenzbereiche, gilt so auch für andere Typen, die auf PA enden)

Den Mega88 (8 kB Flash) gibt es auch noch als Mega48 (4 kB), Mega168 (16 kB) und Mega 328 (32 kB)
Der Mega48 ist ungebräuchlich und fast nicht billiger zu bekommen als der Mega88, die anderen werden bei umfangreicheren Programmen nötig.
Benutzeravatar
TomTTiger
Ultra-User
Ultra-User
Beiträge: 547
Registriert: Mo, 23.06.08, 11:54
Wohnort: Weyerbusch / RP

Di, 11.01.11, 12:57

Hallo,

du solltest noch einen Taster von Reset auf GND vorsehen, dann kannst du den µProz auch zwischendurch ohne abklemmen /ausschalten resetten. Der Taster tut preislich auch nicht weh :D
Und irgentwie vermisse ich eine Stiftleiste zum Programmieren des Proz via ISP oder wenn du ihn per RS232 proggen willst, fehlt dir noch die Serielle Schnittstelle (MAx232N o.ä.) ...

Grüße
Tom 8)
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Di, 11.01.11, 14:32

Programmiert wird er mit dem Board von Pollin. Das is nur zum rumspielen. Den Taster werd ich dann vorsehen.
stromflo
Mega-User
Mega-User
Beiträge: 304
Registriert: Mi, 31.12.08, 12:16

Di, 11.01.11, 18:57

@CRI 93+ /Ra 93+
Also wir haben in der Schule gelernt, dass bei einer stabilisierten Gleichspannung der Elko vor dem Spannungsregler ganz entfallen kann, da der 330nF Kondensator für kleinere Schwankungen ausreicht.
Der Elko soll rein hieß es damals wenn mit größeren Schwankungen der Spannung zu rechnen ist. Sprich wie du oben geschrieben hast z.B. bei ungesiebter Gleichspannung.

@all
Programmiert wird er mit dem Board von Pollin. Das is nur zum rumspielen. Den Taster werd ich dann vorsehen.
Naja auch das Pollin Board hat eine Möglichkeit über ISP zu proggen. Das ständige umstecken der Controller führt halt leider irgendwann immer zum abbrechen von Pins. Man kann die dann teilweise nochmal mit anlöten von Silberdraht aufpeppeln. Grundsätzlich würde ich aber auch gleich eine ISP Schnittstelle einplanen. Hier mal ein Link zu dessen Pinbelegungen. Ich würde dir ISP10 empfehlen, dann kommst beim Pollinboard ohne Adapter aus. Flachbandkabel 10polig mit zwei Pfostenbuchsen brauchste dann zur Verbindung.

Gruß Flo
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mi, 12.01.11, 18:03

So, hab dann jetzt ma alles soweit umgesetzt. Ich hoffe ma, dass es so jetzt richtig is. Nochmals vielen Dank an euch für die schnelle und gute Unterstützung.
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

Mi, 12.01.11, 23:10

@stromflo:
ja, wenn die Spannung Stabil ist, dürften hier 330 nF reichen (bei Schaltreglern sollten es dann aber doch wieder 10 µF aufwärts sein, da dann außerdem Low-ESR, also Tantal oder Keramik.

@all:
Ich empfehle den 6poligen ISP-Stecker, da wirklich *ALLE* Atmel-Tools den nutzen (z.B. der AVR ISP mk II für 35€ bei reichelt) außerdem benötigt der weniger Platz.

10polig sollte nur der JTAG-Stecker sein, JTAG haben aber nicht alle MCU-Typen, wenn sie's haben, kann man darüber aber debuggen, z.B. mit dem AVR Dragon (55€ bei reichelt) --- einige MCUs können auch per ISP (genauer: 1-wire-debug per Reset-Leitung des ISP, Reset-Pull-Up muss dann 10k haben) debugged werden, aber dafür reicht der AVR ISP mk II _NICHT_ aus, dessen Firmware erlaubt das nicht. Der AVR Dragon geht dafür aber sowohl per JTAG als auch per ISP als Debugger zu nutzen (kommt halt auf den Controller an).

Hinweis: ab AVRStudio 4.18 wird für den ja doch sehr günstigen AVR Dragon ein Firmware-Update mitgeliefert, das dessen künstliche Beschränkung auf MCUs mit max. 32 kB FLASH aufhebt!!! (Bisher ließen sich MCUs >32 kB Flash nur mit dem 350€ teuren JTAG ICE debuggen)
stromflo
Mega-User
Mega-User
Beiträge: 304
Registriert: Mi, 31.12.08, 12:16

Mi, 12.01.11, 23:16

Ich empfehle den 6poligen ISP-Stecker, da wirklich *ALLE* Atmel-Tools den nutzen (z.B. der AVR ISP mk II für 35€ bei reichelt) außerdem benötigt der weniger Platz.
Jep, wobei er eben das Pollin Board hat mit 10 poligem ISP Wannenstecker. Darum hier meine Empfehlung 10 polig, dann kann man sich den Adapter sparen. Sicher wenn man AVR ISP mkII z.B. hat würde ich hier auch 6 polig empfehlen. Den AVR ISP mkII nutze ich im übrigen auch, kann ich nur empfehlen.

Gruß Flo
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 24.01.11, 18:57

So, gelötet isses, allerdings hab ich ein kleines problem mit ner IF-Abfrage, die irgenwie nich so will, wie ichs gern hätte.

Code: Alles auswählen

#include <avr/io.h>         

int LED1;

int main (void) 
{            
 
   DDRB  = 0xff;
   PORTB = 0b10000000;             
   
	DDRD  = 0x00;
	PORTD = 0xff;


	LED1 = PINB6;


	if (PIND0 == 0)
	{

	 LED1 = 1;
	
	}

	

   
   return 0;                
}

was hab ich falsch gemacht?
Benutzeravatar
Jay
Hyper-User
Hyper-User
Beiträge: 1096
Registriert: Mo, 08.05.06, 07:54
Wohnort: Österreich

Mo, 24.01.11, 19:46

mal andere frage was ist das für ne Programmier-Sprache?

MfG
Jay
Benutzeravatar
strenter
Ultra-User
Ultra-User
Beiträge: 962
Registriert: Sa, 13.11.10, 21:29
Wohnort: Hessen

Mo, 24.01.11, 19:48

Aus dem Gefühl heraus würde ich C vermuten. Ziemlich sicher sogar.

Hmm, der LED-Ausgang wird ja gar nicht zurückgesetzt. Beabsichtigt?
Probiere mal:

Code: Alles auswählen

LED1 = 1 - PIND0;
ohne irgendwelche ifs.

Ach ja, und warum hat Dein Programm keine Schleife? Oder wird das immer wieder automatisch aufgerufen?
So wie ich das sehe läuft das einmal durch und dann wars das.
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 24.01.11, 20:59

danke ich werds ma morgen probieren.

Wegen schleife, daran hab ich jetzt nicht so gedacht, da ich dachte, dass die dann bei jedem Tastendruck aufleuchtet!

Würde man diese dann mit While machen? Und was würde man als Argument nehemn?
Benutzeravatar
strenter
Ultra-User
Ultra-User
Beiträge: 962
Registriert: Sa, 13.11.10, 21:29
Wohnort: Hessen

Mo, 24.01.11, 21:38

Vermutungen (Lange her dass ich in C reingeschnuppert habe).
Endlosschleife:

Code: Alles auswählen

while 1
{
...
}
Mit Abbruchbedingung:

Code: Alles auswählen

while PIND1 = 0
{
...
}
Aber keine Garantie für die richtige Syntax! ;)
stromflo
Mega-User
Mega-User
Beiträge: 304
Registriert: Mi, 31.12.08, 12:16

Mo, 24.01.11, 22:32

Hi,

also das ist in jedem Fall C :)

Code: Alles auswählen

#include <avr/io.h>          
 
int main (void) {            
 
   DDRB  = 0xff;            //Du setzt alle I/O's des PORTB auf Ausgang 
            
 
   while(1) {                
     //Hauptschleife
   }                       
 
   return 0;                 
}
Das wäre mal ein Grundgerüst!
Dann gibt es grundsätzlich da verschiedene Schreibweisen.
Ich würde z.B.

Damit kannst du PB1 auf High/1 setzen.

Code: Alles auswählen

PORTB |= (1<<PB1);
So kannst du ein einzelnes I/O auf 0 setzen.

Code: Alles auswählen

PORTB &= ~(1<<PB1);
Du willst einen anderen Namen dafür verwenden?
Du vergibst z.B. schon einen Namen für den PORTB

Code: Alles auswählen

#define LED_PORT_1 PORTB
Du vergibst einen Namen für einen Ausgnag

Code: Alles auswählen

#define LED1 0
#define LED2 1
Du setzt diese defines nun im Programm ein.

Code: Alles auswählen

LED_PORT_1 |= (1<<LED1);
Ich lege dir ans Herz die einschlägigen Tutorials wie z.B. unter Mikorcontroller.net oder aber auch ein Buch z.B. Mikrocontroller in Kürze. In dem genannten Buch habe ich selber mitgeschrieben...

Gruß Flo
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

Mo, 24.01.11, 22:52

BlackHawk hat geschrieben:So, gelötet isses, allerdings hab ich ein kleines problem mit ner IF-Abfrage, die irgenwie nich so will, wie ichs gern hätte.

Code: Alles auswählen

#include <avr/io.h>         

int LED1;

int main (void) 
{            
 
   DDRB  = 0xff;
   PORTB = 0b10000000;             
   
	DDRD  = 0x00;
	PORTD = 0xff;


	LED1 = PINB6;


	if (PIND0 == 0)
	{

	 LED1 = 1;
	
	}

	

   
   return 0;                
}

was hab ich falsch gemacht?
Du hast auf einen Eingang geschrieben... (PINnm statt PORTnm)
Beim Atmel AVR sind PINn die Eingänge und PORTn die Ausgänge. DDRB hast Du ja schon komplett auf Ausgang gesetztz, DDRB6 hätte in dem Fall aber gereicht.
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Mo, 24.01.11, 23:30

ah, ok vielen Dank schonma!

Ich hab das jetzt ma geändert, und den PIN durch ein PORT ersetzt. Allerdings leuchtet die LED jetzt ständig.

Ich merk schon, ich hab mir das alles viel zu "einfach" vorgestellt und bin dadurch natürlich auch viel zu blauäugig vorgegangen. Und ja, mein Kumpel und ich lassen uns jeweils zum Geburtstag ein Buch schenken, über die AVR-Programmierung in C!

Code: Alles auswählen

#include <avr/io.h>         


int main (void) 
{            
 
   while(1)
   {
   
   DDRB  = 0xff;
   PORTB = 0x00;             
   
   DDRD  = 0x00;
   PORTD = 0xff;


	if (PIND0 == 0)
	{
	PORTB=0x08;
	}
	
	}
   
   return 0;                
}
Benutzeravatar
strenter
Ultra-User
Ultra-User
Beiträge: 962
Registriert: Sa, 13.11.10, 21:29
Wohnort: Hessen

Mo, 24.01.11, 23:42

Wie ich schon sagte... Du weißt dem Ausgang eine 1 zu wenn Du den Taster drückst. Wann aber weißt Du dem Ausgang die 0 zu damit die LED wieder ausgeht? Vorschlag:

Code: Alles auswählen

 if (PIND0 == 0)
   {
   PORTB=0x08;
   }
else
   {
   PORTB=0x00;
   }
Allerdings beeinflußt Du auf diese Art und Weise auch andere Ausgänge von Port B, die eventuell in späterem Programm gesetzt bleiben sollen! Entweder Du übst Dich in Bitmanipulation im Stile von stromflo, oder Du mußt die Ausgänge zurücklesen, entsprechend mittels VerUNDung (Löschen von Bits) oder VerODERung (Setzen von Bits) maskieren und dann wieder zurückschreiben.

Danke übrigens für das kleine Training. Habe selbst bald ein Projekt bei dem ich einen AtMega in C programmieren will. Da tut sowas recht gut. ;)
Borax
Star-Admin
Star-Admin
Beiträge: 12002
Registriert: Mo, 10.09.07, 16:28

Di, 25.01.11, 14:21

Zum Thema AVR in C programmieren gibt es hier eine sehr schöne Seite:
http://www.mikrocontroller.net/articles ... C-Tutorial
BlackHawk
User
User
Beiträge: 30
Registriert: Mo, 10.01.11, 19:08
Wohnort: Braunschweig

Di, 25.01.11, 14:59

So, wir haben nun auch die Bitmanipulation soweit schonma verstanden und angewendet, aber die Taster wollen einfach nicht funktionieren. Ich habe auch ma mit dem Messgerät geguckt, und die Taster sind funktionsfähig!

Code: Alles auswählen

#include <avr/io.h>         

#define LED1 3			//PB3
#define LED2 4			//PB4
#define LED3 5			//PB5
#define LED4 6			//PB6
#define Tran 7			//PB7
#define Taster1 0		//PD0
#define Taster2 1		//PD1





int main (void) 
{            
 
   
   while (1)
   {
   
	DDRB  = 0xff;
	PORTB |= ((1<<LED1) | (1<<LED3) | (1<<Tran));


	DDRD = 0x00;
	PORTD |= ((1<<Taster1) | (1<<Taster2));


	if (PIND1 == 0)
   		{
  	 	PORTB |= (1<<LED2);
  		 }
	else
  		 {
  		 PORTB &= ~(1<<LED2);
  		 }
	

	
   }
   return 0;                
}

EDIT: ich hab jetzt ma versucht, die IF-Abfrage so zu machen, dass die bei einer "1" leuchtet, was sie auch soll, da sie über den interen PullUp auf High gezogen wird. Also leuchten tut sie, aber wenn ich gegen Masse schalte, dann aber bei PIND0=0, dann tut sich nichts!
Antworten