Problem mit Atmega32 als 8-Kanal-Lauflicht

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Antworten
Benutzeravatar
dedicated
Mega-User
Mega-User
Beiträge: 141
Registriert: Do, 04.01.07, 14:18

So, 21.01.07, 12:07

Um zu lernen wie ein Mikrocontroller arbeitet, wollte ich mit einem einfachen Projekt bzw Test anfangen.

Als Projekt habe ich mir ein Lauflicht mit 8 Leds ausgedacht.
Es sollten erstmal nur Leds angeschlossen werden, also keine Eingänge bzw Taster.

D.h. wenn am Mikrocontroller Spannung anliegt, sollte der ofort mit dem Programm beginnen.


Das Problem ist das ich statt einem Lauflicht einen binären Zähler programmiert habe.:mrgreen: :mrgreen: :mrgreen:

Zur Schaltung:

Betriebsspannung 4.5V
Mikrocontroller AtMega32
Leds Rot diffus ca 2V
Widerstände 150 Ohm

An Vcc kommt die Spannung
An Gnd kommt 0 Volt
An PD0 bis PD7 kommen die einzelnen LEDs mit Vorwiderstand
1276_Pinatmega_1.jpg
1276_Pinatmega_1.jpg (28.68 KiB) 9994 mal betrachtet
Auf meinem Steckboard sieht das so aus:
1276_DSCI0052_1.jpg

Zum Programmcode:

Das Programm habe ich in C geschrieben, weil ich die Sprache schon kann.
Also in einem Editor den C-Quelltext geschrieben.
Ein Makefile erstellt, welche an den Atmega32 angepasst ist.
Dann mit WinAVR den Quellcode zu einem Hex-File compiliert.
Die HEX Datei mit Ponyprog mittels Polliboard auf den ATMega geflasht.

Der Quelltext:

Code: Alles auswählen

#include <avr>
#include <stdint>
#define F_CPU 1000000UL  
#include <util> 
 
int main(void)
{
	uint8_t i=0;
	
   	DDRD = 0xff;
        PORTD = 0x00;
	
	while (1) 
	{
        PORTD = i;
        i++;
       
        _delay_ms(1000);
      	}
return 0;
}

Das Problem liegt in der while Schleife

PORTD sind die Ausgangsports PD0 bis PD7
PORTD wird mit der Variablen i gleichgesetzt

i++ bedeutet das die Variable um 1 erhöht wird
i++ ist ein 8Bit Integer

Aber PORTD wird entweder mit hexwert oder binär definert.
PORTD = 0xFF hexwert
PORTD = 0b11111111 binär



Also wie schaffe ich es das immer nur ein Ausgangspin weiter geschaltet wird?:?: :?: :?:

Ich geh erstmal essen und danach lade ich ein Video vom Binär-Zähler hoch.

mfg Martin
jmayer
Mega-User
Mega-User
Beiträge: 103
Registriert: Di, 09.01.07, 14:05
Wohnort: Weinstadt
Kontaktdaten:

So, 21.01.07, 12:21

dedicated hat geschrieben:Das Problem ist das ich statt einem Lauflicht einen binären Zähler programmiert habe.:mrgreen: :mrgreen: :mrgreen:
grins ;-)
Also wie schaffe ich es das immer nur ein Ausgangspin weiter geschaltet wird?:?: :?: :?:
das Zauberwort heiss "Schiebeoperationen"

Code: Alles auswählen

#include <avr>
#include <stdint>
#define F_CPU 1000000UL 
#include <util>
 
int main(void)
{
   	uint8_t i=1;			// dieses eine Bit soll rotieren ;-)
    uint8_t j=0;			// Hilfszähler 
      
	DDRD = 0xff;
    PORTD = 0x00;
   
   while (1)
   {               
        if( j > 7 ) {		// nach 8 Schiebeoperationen gehts von vorne los
        	i = 1;			
        	j = 0;
        }
       	j++;				// Hilfszähler für die Schiebeposition

        PORTD = i;        
        i = i << 1;			// hier schieben wir um eine Stelle nach links

       	
        _delay_ms(1000);
         }
return 0;
}
(ungetestet - müsste aber funzen)
Benutzeravatar
dedicated
Mega-User
Mega-User
Beiträge: 141
Registriert: Do, 04.01.07, 14:18

So, 21.01.07, 14:54

Danke Jürgen für deine Unterstützung

Hab dein Quellcode schon compiliert, aber noch nicht am laufen.

Muss erst ein altes IDE-Kabel zurechtschnibbeln, damit das lästige hin und her stecken des Mikrocontrollers entfällt.


Hier is das Video vom Binär-Zähler :mrgreen: :mrgreen: :mrgreen: , ca. 1min lang

http://www.youtube.com/watch?v=389t6IvSsew


mfg Martin
DnM
Hyper-User
Hyper-User
Beiträge: 1118
Registriert: Mi, 24.05.06, 20:58
Wohnort: Bonn
Kontaktdaten:

So, 21.01.07, 14:59

nice

ach ja ich hätte ersma gedacht das lauflicht wäre viel einfacher als der zähler aber es ist genau andersrum irgendwie komisch die technik
Benutzeravatar
Jay
Hyper-User
Hyper-User
Beiträge: 1096
Registriert: Mo, 08.05.06, 07:54
Wohnort: Österreich

So, 21.01.07, 15:17

das ist auch einfach, nur wenn man gleich mit C anfängt :lol: muss man anders rum denken :D

Code: Alles auswählen

$regfile = "m8def.dat"  '<- Hier wird der Microcontroller-Typ festgelegt, in diesem Code ist es der Atmega8, für Atmega32 wäre es "m32def.dat" anstatt "m8def.dat" 

$crystal = 1000000

Config Pind.8 = Output
Config Pind.7 = Output
Config Pind.6 = Output
Config Pind.5 = Output
Config Pind.4 = Output
Config Pind.3 = Output
Config Pind.2 = Output
Config Pind.1 = Output

Enable Interrupts      ' <- ich weiß nicht ob das wichtig ist

Led1 Alias Portd.1
Led2 Alias Portd.2
Led3 Alias Portd.3
Led3 Alias Portd.4
Led5 Alias Portd.5
Led6 Alias Portd.6
Led7 Alias Portd.7
Led8 Alias Portd.8

Dim Zaehler as Integer 

Zaehler = 1

Do

If Zaehler = 1 Then Led1 = 1 else Led1 = 0
If Zaehler = 2 Then Led2 = 1 else Led2 = 0
If Zaehler = 3 Then Led3 = 1 else Led3 = 0
If Zaehler = 4 Then Led4 = 1 else Led4 = 0
If Zaehler = 5 Then Led5 = 1 else Led5 = 0
If Zaehler = 6 Then Led6 = 1 else Led6 = 0
If Zaehler = 7 Then Led7 = 1 else Led7 = 0
If Zaehler = 8 Then Led8 = 1 else Led8 = 0
If Zaehler = 9 Then Zaehler = 0

Zaehler = Zaehler + 1

waitms 1000              ' EDIT: Warte Zeit in millisekunden

Loop 
so kenn ich das aus basic :D

MfG
Jay
Zuletzt geändert von Jay am So, 21.01.07, 17:08, insgesamt 2-mal geändert.
Benutzeravatar
dedicated
Mega-User
Mega-User
Beiträge: 141
Registriert: Do, 04.01.07, 14:18

So, 21.01.07, 16:28

Gratulation an Jürgen Mayer, hab dein Code ausprobiert und er läuft perfekt. :D :D :D :D

Hier ein Video vom Lauflicht:

http://www.youtube.com/watch?v=G6mtHG2nucw



@JAY

Bei deinem Code fehlt eine Wartezeit.
Da du die Taktfrequenz mit $crystal = 1000000 auf 1MHz eingestellt hast, würde man kein Lauflicht sehen,
sondern alle 8 LEDs gleichzeitig, weil der Mikrocontroller viel viel viel schneller ist als dein Auge.

Trotzdem Danke Jay werde die Basic-Variante gleich mal ausprobieren.

Mfg Martin
jmayer
Mega-User
Mega-User
Beiträge: 103
Registriert: Di, 09.01.07, 14:05
Wohnort: Weinstadt
Kontaktdaten:

So, 21.01.07, 17:47

hallo,
dedicated hat geschrieben:Gratulation an Jürgen Mayer, hab dein Code ausprobiert und er läuft perfekt. :D :D :D :D
oh - danke - freut mich das mein Geschreibsel dir einen Schritt weitergeholfen hat.
Antworten