Forum: Mikrocontroller und Digitale Elektronik Einfache Programm-Frage - Atmel Studio


von Max F. (mfh)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe hier schonmal Fragen bezüglich der Hardware zu meiner ersten 
Mikrcontroller-Bastelei gestellt und hätte jetzt noch eine zur 
Programmierung. Vlt gibt es ja den ein oder anderen, der die Nerven hat 
mir weiter zu helfen :D Hoffe ich bin in der richtigen Abteilung des 
Forums unterwegs hier!

Ich will eigentlich nichts machen, als eine große Endlosschleife 
aufzubauen, in der ich per "if" Schleifen über die als Eingang 
parametrierten Pins entsprechende andere Pins als Ausgang ein- oder 
ausschalte.
Also in diesem kleinen Experiment im Anhang möchte ich aus 
Adressregisterbereich B der Pins des Mikrocontroller den Pin08 in der 
Variablen Blinker_rechts ablegen. Wenn eine "0" statt einer "1" am Pin 
anliegt soll die Variable die If-Schleife anstoßen und den Ausgang des 
Bereichs "D" zum Blinken bringen.
Vlt geht das ja so :D

Ich wollte das kleine Programm in der Simulation laufen lassen, aber da 
kommen zwei Errors (unten im Bild). Ich habe schon ein bisschen 
gegoogelt und probiert, aber komme noch nicht dahinter was ich ändern 
muss, damit sie verschwinden.
Weiß vlt jemand mehr dazu?

Vielen Dank!

von F. F. (foldi)


Lesenswert?


von Markus H. (dasrotemopped)


Lesenswert?

versuchs mal mit
void *Blinker_rechts;
und einer Auffrischung von "Zeigerarithmetik in C"

Gruß,

dasrotemopped.

von F. F. (foldi)


Lesenswert?

Guck dir das mal an:
1
#define F_CPU 1200000
2
3
#define  Relais PB1
4
#define SchalterOn PB2
5
#define Eingang PINB
6
#define AusgangB PORTB
7
8
#include <avr/io.h>
9
#include <util/delay.h>
10
11
12
13
14
int main(void)
15
{
16
    
17
  
18
  DDRB |= (1<<Relais);
19
  DDRB &= ~ (1<<SchalterOn);
20
  //PORTB |= (1<<SchalterOn);
21
  
22
    while(1)
23
    {
24
        if (Eingang & (1<<SchalterOn))
25
    
26
    {
27
      AusgangB |= (1<<Relais);
28
      _delay_ms(10000);
29
    }
30
31
   }
32
  return 0;
33
  }

von Peter K. (peterka2000)


Lesenswert?

Probier mal int bzw. uint8_t anstatt void.

von F. F. (foldi)


Lesenswert?

Das oben gebrachte Beispiel schaltet einfach nur ein Relais ein, wenn 
der ursprüngliche Schalter betätigt wird und sollte vergessen werden den 
Schalter wieder aus zu schalten, dann schaltet das Relais nach dem Delay 
ab.
Das ist eine reale Schaltung, bzw. das Programm dafür.
Kein Timer nötig, da es nur verhindern soll, dass die Batterie leer 
gezogen wird, wenn die magnetische Entriegelung vergessen wird manuell 
abzuschalten.
Es ist sehr einfach, aber vielleicht verstehst du so wie Variablen 
einzusetzen sind.

von c-hater (Gast)


Lesenswert?

Max F. schrieb:

> Ich will eigentlich nichts machen, als eine große Endlosschleife
> aufzubauen, in der ich per "if" Schleifen

Offensichtlich ein Troll. void als Datentyp für eine Variable, 
"if-Schleifen", alles klar.

If-Schleife alleine hätte auch ein Anfänger sein können. Aber auf void 
als Datentyp kommt kein Anfänger, das kann nur vergiftetes Trollfutter 
sein.

von F. F. (foldi)


Lesenswert?

c-hater schrieb:
> das kann nur vergiftetes Trollfutter
> sein.

Dann bin ich wohl drauf rein gefallen. :-(

von Max F. (mfh)


Lesenswert?

Vielen Dank für alle "ernst gemeinten" Antworten!
Ich kenne mich halt nicht damit aus, will mir aber das nötige Wissen 
aneignen, um das oben Beschriebene umzusetzen.
Auf Void bin ich folgendermaßen gekommen: Ich kenne Siemens S7 ein 
bisschen und habe mir gedacht es wäre gut Variablen anzulegen, um den 
Überblick zu wahren. Habe dann einfach mal Blinker_rechts in das Atmel 
Studio eingetippt, ein = dahinter gemacht und dann wurde ich gefragt, ob 
es eine globale oder eine lokale Variable werden soll. Ich hab mich für 
global entschieden, drauf geklickt und alles stand so fertig da... Ich 
wäre dankbar wenn nicht son Troll-Blödsinn geschrieben wird, ich habe 
weder lange Ohren, noch grünes Fell, noch die Lust sowas zu lesen.

Vlt wäre If-Bedingung oder -Abfrage richtiger?

Ich habe einfach mal das Sternchen davor geschrieben (void 
*Blinker_rechts;), wie "dasrotemopped" :P vorgeschlagen hat und das 
debuggen bzw. sie Simulation ließ sich schon ohne Error starten. Muss 
mir heute Abend aber erst nochmal genau ansehen wie diese zu bedienen 
ist.

@foldi:
Definierst du alle Variablen, in meinem Fall jeden Pin, einfach mit 
"define"?
#define  Relais PB1  heißt dann was genau? Steht das PB1 schon für die 
Zuordnung des Pins?

Und dann noch:
  DDRB |= (1<<Relais);
  DDRB &= ~ (1<<SchalterOn);
Was bedeuten die Pfeile? Ein Vergleich auf 1?
Was machst du an der Stelle? Ich habe nach meiner Suche gefunden, dass 
man z.B. hiermit definiert was Ein- bzw. Ausgänge sind: DDRD=0b00010000;

Entschuldigt meine Unwissenheit :D

von F. F. (foldi)


Lesenswert?

Max F. schrieb:
> @foldi:
> Definierst du alle Variablen, in meinem Fall jeden Pin, einfach mit
> "define"?
> #define  Relais PB1  heißt dann was genau? Steht das PB1 schon für die
> Zuordnung des Pins?
>
> Und dann noch:
>   DDRB |= (1<<Relais);
>   DDRB &= ~ (1<<SchalterOn);
> Was bedeuten die Pfeile? Ein Vergleich auf 1?
> Was machst du an der Stelle? Ich habe nach meiner Suche gefunden, dass
> man z.B. hiermit definiert was Ein- bzw. Ausgänge sind: DDRD=0b00010000;
>
> Entschuldigt meine Unwissenheit :D

Wenn man ein Programm portierbar machen möchte, macht so etwas Sinn.
Dann braucht man nur noch die Pins ändern, statt das ganze Programm.

Kaufe dir dieses Buch:
http://www.franzis.de/elektronik/simulation-computer/avr-mikrocontroller-kochbuch

Es ist das beste Buch und da werden Fragen beantwortet noch bevor du sie 
dir selbst stellst. Dazu kommt hinzu, dass sie dort aktuelle µC benutzen 
und nicht mit dem ewig alten ATmega8 als Beispiel anfangen.
Also auch den ATmega328, wie er auf vielen Arduinos ist.
Dazu solltest du dir aber auch noch ein C-Buch kaufen.

Sei mir nicht böse, aber auf deine Fragen jetzt einzugehen, bedeutete 
ich lese dir ein C-Buch vor.
http://www.amazon.de/C-Programmieren-Anfang-Helmut-Erlenk%C3%B6tter/dp/3499600749
Das noch dazu und du verstehst alles in wenigen Tagen.

von Max F. (mfh)


Lesenswert?

Vielen Dank für die Empfehlungen! Es wird wahrscheinlich das beste sein.

Viele Grüße!

von F. F. (foldi)


Lesenswert?

Anfangs ist das alles sehr schwer, aber wenn du täglich etwas Zeit dafür 
hast, dann kommen die Erkenntnisse im Quadrat.

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.