Einstieg in C-Programmierung

Gast #180650
Lesenswert?

Ich habe begonnen, mich mit C-Programmierung rein privat zu
beschäftigen. Bisher habe ich Erfahrungen mit Intel 8086 und Infineon
C166 unter Assembler im Rahmen meines Studiums gemacht. Für C habe ich
mir ein Controllerboard mit einem Atmega32 selber auf Lochraster
gebaut.

Zum Test hatte ich folgendes kurzes Proggi für WinAVR getippelt. Ich
wollte die oberen 5 Bit von Port D (habe dort nur 5 Taster wegen der
RS232) einlesen und auf Port C (LED's) ausgeben.

**************************************************************
#include <avr/io.h>

int x;

int main(void)
{
  DDRC = 0b11111000;
  x = PIND;
  PORTC = x;
  return 0;
}
**************************************************************

Leider funzt das wahrscheinlich nicht so einfach. Sieht jemand den
Fehler? Ich vermute mal, es ist ein logisches Problem. Selbst im
AVR-GCC-Tutorial konnte ich keinen sinnvollen Hinweis finden.

Ich danke Euch schonmal für Eure Hilfe

Viele Grüße
müllo
Gast #180651
Lesenswert?

Hi

wohin soll denn das Programm zurückkehren? Auf deinem µC läuft kein OS
das die Kontrolle am Ende des Programms wieder übernehmen kann. Du
brauchst also irgendwo eine Endloßschleife die endlos das macht was du
willst:

#include <avr/io.h>

int main(void)
{
  int x;

  //DDRC = 0b11111000;  << das ist so kein Standard-C
  DDRC = 0xF8;

  while(1)
  {
    x = PIND;
    PORTC = x;
  }

  return 0;
}
Gast #180652
Lesenswert?

Wie sind die Taster angeschlossen?
Wie sind sind die LEDs angeschlossen?

Für die Taster gibt es zwei sinnvolle Möglichkeiten:

 1.
                  Vcc
                  |
                 R10k
                  |
     AVR ---R100--#
                  |
                   /
                  |
                 R100
                  |
                 GND

2.
                  Vcc
                  |
                 R100
                  |
                   /
                  |
     AVR ---R100--#
                  |
                 R10k
                  |
                 GND

 Wobei die Wiederstandswerte nur die Großenordnung angeben.

Für die LEDs gibt es eigentlich (aus TTL-Sicht) nur eine
sinnvolle Anschlußart:

   AVRout---R470--|<|---Vcc      ... to be continued
Gast #180653
Lesenswert?

...das Textfeld war zu Ende...

Für Fall 1 des Tasters könnte man den Pull-Up Widerstand weglassen
falls man die AVR internen aktiviert.  (PORTD = 0xFF;)

Und dunkel kann ich mich erinnern... Eventuell muss das JTAG Interface
disabled werden, das kommt entweder mit PORTD oder PORTC ins Gehege.
Habe gerade das Datenblatt nicht zur Hand.

// Disable JTag Interface in case of ATmega32 (or FUSE disable)
#if defined (_AVR_ATmega32_)
    // Sonst funktioniert das LCD an PortC nicht
    unsigned char sreg = SREG;
    cli();
    // Zweimal innerhalb von 4 Taktzyklen schreiben
    MCUCSR |= (1<<JTD);
    MCUCSR |= (1<<JTD);
    SREG = sreg;
#endif


Dann sollte das von der Logik her eigentlich klappen, wenn Du x als
char definierts; die I/O-Ports sind nur 8 Bit bereit :)

Und natuerlich die while(1) Schleife!
Gast #180655
Lesenswert?

Hallo Werner,

vielen Dank für die vielen Hinweise. Mal kurz zu meinem Layout:

RESET:
******
VCC   <---R=10K---|
                  #--RESET-Pin AVR
Masse |---C=47p---|

********************************************************

LED:
****

PORT-Pin---R=1K---|>|---Masse
(ich wollte die Anzeige H-aktiv machen, also 1 an Port-Pin = LED an)

********************************************************

Taster:
*******
                 Vcc
                  |
                  |
                   /
                  |
           AVR ---#
                  |
                 R10k
                  |
                 GND

Ich habe keine zusätzlichen Längswiderstände eingebaut. Aber das dürfte
kein Problem sein. JTAG ist deaktiviert, FUSES auf CKSEL=0000 und SUT=10
(externer Oszillator 8MHz, 65ms Softstart). Mein Problem liegt sicher an
der Schleife, zumal ich sogar bei meinem Assemblerproggs einen "JMP
Loop" programmiert hatte :)))

Ich melde mich nach Probe nochmal kurz. Für Kritiken an meinem Layout
bin ich ebenfalls sehr dankbar.

Cu müllo
Gast #180657
Lesenswert?

Die Reset-Beschaltung sollte man entweder entsprechend der ESD-Appnote
von Atmel ausführen (AVR 040) oder ganz weglassen.  Letzteres ist
sicher nicht für den rauhen Betrieb sinnvoll, aber für den Basteltisch
genügt's allemal.

Den Kondensator am Reset-Pin will man normalerweise nicht so groß
machen, dass ein externer Reset beim Powerup ausgelöst wird, weil man
den sonst nicht mehr in der Software von einem Powerup-Reset
unterscheiden kann.

Das Hauptproblem wird aber sicher die fehlende Schleife sein, keine
Frage.  Übrigens kann man die temporäre Variable auch noch sparen
(der Compiler wird sie sowieso wegoptimieren):

for (;;) PORTC = PIND;

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