mikrocontroller.net

Forum: Compiler & IDEs Einstieg in C-Programmierung


Autor: müllo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil cih gerade noch "selber auf Lochraster
gebaut." lese...

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

Autor: müllo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.