Du hast den Port als Eingang konfiguriert. Um PD5 als Ausgang zu konfigurieren, musst Du DDRD auf 0x20 setzen. PRR1 musst Du nicht setzen, nach einem Reset sind die alternativen Port-Funktionen immer ausgeschaltet.
Gruß,
askazo
Hallo,
ich habe das RN-Mega2560 und möchte mit etwas einfachem anfangen. In der Anleitung steht, dass die blaue LED auf dem Board leuchtet, wenn PortD5 auf low ist. Also habe ich eingetragen:
#include <avr/io.h>
int main(void)
{
PRR1 = 0xFF;
DDRD = 0x00;
PORTD = 0x00;
while(1)
{
}
}
PRR1 habe ich auf high gesetzt, weil ich gelesen habe, dass PortD5 auch als XCK1 (Clock) für Usart1 dienen kann und high in PRR1 schaltet die Usarts aus.
Trotzdem bekomme ich ein blaues Leuchten.
Was könnte verkehrt sein?
Danke.
Grüße
Robert
Du hast den Port als Eingang konfiguriert. Um PD5 als Ausgang zu konfigurieren, musst Du DDRD auf 0x20 setzen. PRR1 musst Du nicht setzen, nach einem Reset sind die alternativen Port-Funktionen immer ausgeschaltet.
Gruß,
askazo
Du sagst die LED leuchtet wenn der Pin low ist. Mit DDRD = 0x00 schreibst du ins Data Direction Register von Port D 0000 0000 rein, was bedeutet das der komplette Port als Eingang konfiguriert ist. Desweiteren setzt du mit PORTD = 0x00 den kompletten Port D auf low. Und wenn du sagst das die LED bei einem Low an dem Pin leuchtet, ist es klar das sie leuchtet wenn du den kompletten Port auf 0 setzt
Wenn du die LED ausschalten willst musst du erstmal den Port als Ausgang konfigurieren wie es oben steht und dann schreibst du noch:
PORTD = 0x020;
Damit schreibst du in dem 5. Bit von dem Port D Register eine 1 und damit deaktivierst du die LED. Die LED auf dem Board ist "Active Low" geschaltet d.h. sie ist Aktiv wenn der Pin wo sie angeschlossen ist low ist. Im Umkehrschluss musst du den Pin also High setzen um sie zu deaktivieren.
Hallo,
danke für die Antworten. Ich habe das Programm entsprechend geändert, aber die LED leuchtet immer noch nicht (ich möchte das sie leuchtet):
#include <avr/io.h>
int main(void)
{
DDRD = 0x20;
PORTD = 0x00;
while(1)
{
}
}
Ich habe auch schon das Programm wieder ausgelesen aus dem Chip und mit der HEX datei verglichen, die ich reichgeschrieben habe, es ist die gleiche.
Ich habe auch schon PIND7 (welcher keine anderen Funktionen hat) mit:
DDRJ |= (1<<PJ7);
PORTJ |= (1<<PJ7);
auf Ausgang und High gestellt. Damit müsste ich 5V an dem Ausgang abgreifen können, aber es haut nicht hin.
Müssen irgendwelche Fusebits angepasst werden, wenn man über ISP programmiert? Kann sonst was falsch sein? Ich gebe nur 5V und GND auf die Platine, sonst nix.
Danke.
Grüße
Robert
Du musst auch schon den Pin High setzen damit die LED aus geht.
Wir missverstehen uns glaub ich. Die LED soll an sein, nicht aus.
Ähm sorry verschrieben. Ich meinte du musst den Pin auf Low setzen damit die LED an geht.
Ich habs gefunden. Der Fusebit bootrst musste raus (dissabled) damit er bei Addresse $0000 startet. Dann nochmal programmiert und nun leuchtet die LED.
UFF
Ja wegen dem Bit startet er bei einer deffinierten Adresse, da dieses Bit für einen Bootloader da ist. Sonst würde man bei jedem programmieren den Bootloader überschreiben. Da der Controller bei dir aber so wie ich das verstanden habe, keinen Bootloader besitzt schreibt er das Programm ab Adresse 0000 in den Flash aber der Controller spricht diese nicht an
Hallo,
ich will nicht unbedingt wegen jeder Sache einen neues Thema eröffnen, deshalb schreibe ich nochmal hier rein. Ich will den MPU aller x Minuten etwas machen lassen, also:
unsigned int flag = 0;
int main {
TCCR0B |= (1<<CS02) | (1<<CS00); //setzt vorteiler auf 1024
TIMSK0 |= (1<<TOIE0); //setzt Interrupt bit
sei(); //aktiviert interrupt
while (1)
{do something if flag 3662}
}
ISR(TIMER0_OVF_vect)
{
flag++;
}
Nun funktioniert alles soweit gut, aber die Zeit stimmt nicht. Ausgegangen davon, dass der 2560er 16 MHz hat habe ich folgendes gerechnet:
16000000 (MPU)/1024 (für vorteiler)/256 (Überlaufbit) = 61, ... pro Sekunde
Das heißt mal 60 (für 1 Minute) müsste es 3662 mal durchlaufen um eine Minute zu erreichen. Nur sind es in Realität 50 Sekunden (etwa). Ich habe es schon mit 20MHz probiert aber da kommt zuviel bei raus (4578 = 1 Minute 8 Sekunen).
Welchen Fehler habe ich in meiner Rechnung?
Danke für die Hilfe
Robert
Lesezeichen