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
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; }
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
...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!
Weil cih gerade noch "selber auf Lochraster gebaut." lese... Der Reset Eingang braucht unbedingt einen Pull-UP Widerstand...
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
Statt des winzigen 47pF-Kondensators solltest Du vielleicht der Anstiegszeit Deines Netzteils mehr Spielraum lassen und 100nF verwenden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.