Forum: Compiler & IDEs Einstieg in C-Programmierung


von müllo (Gast)


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

von Matthias (Gast)


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;
}

von Werner B. (Gast)


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

von Werner B. (Gast)


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!

von Werner B. (Gast)


Lesenswert?

Weil cih gerade noch "selber auf Lochraster
gebaut." lese...

Der Reset Eingang braucht unbedingt einen Pull-UP Widerstand...

von müllo (Gast)


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

von Rufus T. Firefly (Gast)


Lesenswert?

Statt des winzigen 47pF-Kondensators solltest Du vielleicht der
Anstiegszeit Deines Netzteils mehr Spielraum lassen und 100nF
verwenden.

von Jörg Wunsch (Gast)


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;

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.