Einfache Programm-Frage - Atmel Studio

#3856087
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!
Angehängte Dateien:
#3856106
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
  }
#3856117
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.
Gast #3856118
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.
#3856172
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
#3856189
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren