AVR Microcontroller

Hallo Liebe/-r Experte/-in,

Ich wollte mir quasi eine eigene Alarmanlage bauen,
mit einem AVR Microcontroller.
Ich hatte mir das so gedacht, dass es einen Hauptschalter gibt, und wenn der aus ist, ist die Alarmanlage halt aus, das wollte ich über den 1.Pin machen,
dann sollte der 2.Pin das Ende einer Lichtschranke sein,
und wenn da der Strom halt niedrig ist, soll der Pin3 und 4 auf High gesetzt werden (Ausgänge)
jetzt habe ich halt nur die Frage, ob das So geht, wie ich das geschrieben habe, bevor ich mir noch meine Microcontroller kaputt mache,
hier das Programm:
#include
#include

int main (void) {
//Eingänge
DDRA |= (1

Zeig mir mal deine Schaltung, du musst die Eingänge schützen und dafür sorgen dass die Spannung an den Eingängen nicht zu hoch werden kann.

Die Ausgänge können nur max. 25mA treiben.

//--------------------------------------------------
int main(void)
{
DDRA = 0b00011100; // 4,3,2 Ausgänge , 7,6,5, 1,0 Eingänge
PORTA = 0b00000000; // keine Pull-Up’s für die Eingänge / Ausgänge auf LOW(GND) setzen

//Variable bPortA ins Leben rufen
uint8_t Zp0 = 0;
uint8_t Alarm;
// Zp0 = („ein“);
Zp0 = 0b00000000; // 1 Byte besteht aus 8 Bit

while (1)
{
// PinA_0 ist high?
if (PINA & 0x01)
{
//Ausgänge auf 0 (aus) setzten
PORTA &= ~((1

Danke, für deine Antwort, werde die Ratschläge beherzigen

Ich habe eine Frage:
if (PINA & 0x01)
{
//Ausgänge auf 0 (aus) setzten
PORTA &= ~((1

Siehe meine Anmerkungen und Fragen unten

Hallo Liebe/-r Experte/-in,

Ich wollte mir quasi eine eigene Alarmanlage bauen,
mit einem AVR Microcontroller.
Ich hatte mir das so gedacht, dass es einen Hauptschalter
gibt, und wenn der aus ist, ist die Alarmanlage halt aus, das
wollte ich über den 1.Pin machen,
dann sollte der 2.Pin das Ende einer Lichtschranke sein,

>> Was ist das „Ende einer Lichtschranke“ ???

und wenn da der Strom halt niedrig ist, soll der Pin3 und 4
auf High gesetzt werden (Ausgänge)
jetzt habe ich halt nur die Frage, ob das So geht, wie ich das
geschrieben habe, bevor ich mir noch meine Microcontroller
kaputt mache,
hier das Programm:
#include
#include

int main (void) {

>> Bei Eingängen muss das Bit auf 0 und bei Ausgängen auf 1 gesetzt werden.

//Eingänge
DDRA |= (1> Also : DDRA &= ~((1> Und: DDRA |= (1> Das geht so nicht! Hier wird einem Byte ein String zugewiesen.

Der Compiler wirf folgende Meldung:
„warning: assignment makes integer from pointer without a cast“

while(1) {
//Überprüfen, ob auf PINA Strom ist, wenn Strom drauf ist,
PIN5 auf 0 setzten, ausschalten
if ( PINA & (1> Das folgende wird gar nicht übersetzt:

>> Du kannst kein byte mit einem String ver-UNDen

if(Zp0 & „aus“) {
PORTA |= (1> Das folgende wird gar nicht übersetzt:

>> Du kannst kein byte mit einem String ver-UNDen

if(Zp0 & „ein“) {
//Ausgänge auf 0 (aus) setzten
PORTA &= ~( (1> Vielleicht erstmal hier in den AVR einarbeiten. Dann wäre ein Schaltbild hilfreich:

>> http://www.mikrocontroller.net/articles/AVR-GCC-Tuto…

Danke Im Voraus für die Hilfreichen Fragen

LG Lucas

Gruß,
Michael

Ok habe das mal geändert:
So wie ich das jetzt habe:
#include
#include

int main (void) {
//Eingänge
DDRA &= ~((1

Siehe unten

Ok habe das mal geändert:
So wie ich das jetzt habe:
#include
#include

int main (void) {
//Eingänge
DDRA &= ~((1> Nie mit Klammern sparen, es sei denn man weiß die Operator Precedence auswendig. Sonst kann man ewig Fehler suchen.

DDRA |= ((1> hier kann statt der neuen Abfrage ein „else“ stehen.

if ( PINA & 0x01 ) {

>> Das funktioniert nicht.
>> (Zp0 & 0b00000000) löscht alle Bits in Zp0 ist deshalb immer 0
>> Vielleicht meinst du (Zp0 == 0)

if (Zp0 & 0b00000000) {
//Ausgänge auf 0 (aus) setzten
PORTA &= ~( (1> siehe oben (Zp0 & 0) ist immer 0
if (Zp0 & 0) {
//Ausgänge auf 0 (aus) setzten
PORTA &= ~( (1> siehe oben
if (Alarm & 0) {
//Wenn Pin nr.2 wenig strom hat, sprich Lichtschranke
durchbrochen Variable setzten uns Pin 3,4 einschalten
PORTA |= ( (1> siehe oben
if (Alarm & 0b00000000) {
PORTA |= ( (1> wird nie erreicht
return 0;
}

Ja ok, aber ist das denn schon einmal richtiger als vorher?
und Zp0 = 0b00000000; hat der Vorgänger von dir mir gesagt :wink:
weiß aber nicht wirklich, wie das gemeint war:
Zp0 = 0b00000000; // 1 Byte besteht aus 8 Bit
Alarm = 0;

Nein, das ist leider nicht richtiger als vorher, nur weniger falsch. Du wirst es jetzt übersetzen können, aber es wird nicht machen was du willst.
Zp0 = 0b00000000; kannst du natürlich schreiben. Ist Geschmackssache und kein Standard C sondern eine Atmel Eigenheit. Wenn du keine Bits brauchst, dann reicht auch Zp0 = 0.
Falsch ist trotzdem if( Zp0 & 0b00000000 )
„&“ verknüpft zwei Variable bitweise miteinander.
1 & 0 => 0
0 & 0 => 0
Also ist das Ergebnis immer 0.

Kann man denn auch Zp0 =1 ; schreiben?

Wenn du willst, dass die Variable Zp0 den Wert 1 enthält, dann ja.
Du kannst einer Variable vom Typ uint8_t (unsigned char) jeden Wert zwischen 0 und 255 zuweisen.

Kann man denn auch Zp0 =1 ; schreiben?

Also würde das dann so gehen:
#include
#include

int main (void) {
//Eingänge
DDRA &= ~((1

Ich habe mir schon einmal die Verbindung von einem AVR zu einem ISP angeschaut, werde daraus aber nicht leider schlau, wie genau ich was jetzt mit 123456 verbinden muss, um das Programm auf den AVR zu schreiben

Meine hellseherischen Fähigkeiten sind leider begrenzt.
Welcher AVR und welcher ISP?

Ich habe mir schon einmal die Verbindung von einem AVR zu
einem ISP angeschaut, werde daraus aber nicht leider schlau,
wie genau ich was jetzt mit 123456 verbinden muss, um das
Programm auf den AVR zu schreiben

achso entschuldige ich habe einen ATtiny 2313 - 20 UP mit 20 MHz und ISP: USB ISP Programmer für Atmel AVR ATMega ATtiny 51 Board

Die Antwort findest du im 2313 Datenblatt auf Seite 163 und im AVRISP mkII auf Seite 26

achso entschuldige ich habe einen ATtiny 2313 - 20 UP mit 20
MHz und ISP: USB ISP Programmer für Atmel AVR ATMega ATtiny 51
Board

verstehe nicht ganz, was du damit meinst

Hallo Lucas,
ich muss mich entschuldigen, ich habe schon länger keinen AVR Mikrocontroller mehr programmiert, deswegen kann ich dir keine Hinweise zu deinem Quellcode geben. Du solltest das Programm aber einfach mal ausprobieren. Kaputt machen kannst du dadurch nichts, du solltest nur bei den Fuse-Bits darauf achten, welche du setzt. Falls du nicht weißt was das ist, solltest du danach googeln. Auf der Seite „www.mikrocontroller.net“ kannst du zu diesem Thema auch etwas finden. Ich wünsche dir viel Erfolg beim ausprobieren.

Viele Grüße Alex

AT Tiny 2313 Datenblatt auf Seite 163: Anschlussbelegung serielle Programmierung
AVRISP mkII auf Seite 26: Anschlussbelegung ISP

Was verstehst du da nicht?

verstehe nicht ganz, was du damit meinst

Ich verstehe nicht, wo ich das finden sollte