Hallo,
ich bin neu im Programmieren und wollte mir eine Waage bauen mittels
einer Wägezelle und dem HX711. Ich programmiere mit dem ATMEGA16 und in
ATMELSTUDIO. Ich habe bereits einen Code geschrieben, aber er
funktioniert nicht ganz. Habe auch ein paar Warnings. Wäre sehr nett,
wenn ihr kurz drüber schauen könntet.
Beim HX711 handelt sich es um einen 24 Bit ADC. Es gebt mir hierbei nur
um die Auswertung der 24 Bit. MSB First. Außerdem bin ich mir nicht
sicher ob man den HX711 mit UART auswerten kann.
Code:
Kenan schrieb:> bitWrite(x,0,PIND & (1<<PIND0));
Bist du dir da sicher?
Dazu passend auch...
Kenan schrieb:> argument 1 of 'bitWrite' makes pointer from integer without a cast> [-Wint-conversion]
Vielleicht mit einem klassischen
PIND |= (1<<PD0);
zum toggeln des Bit 0 im PORTD-Register probieren?
Geht aber nicht mit ganz alten Atmegas.
Oder willst du eigentlich was ganz anderes erreichen?
Kenan schrieb:> ISR(USART_RXC_vect)
Wo wird das Interruptflag gelöscht?
Nirgendwo liest du das UART-Datenregister oder Schreibst eine 1 an
passende Stelle im Flagregister.
Aus dem Kommentar hier
Kenan schrieb:> // schreibt den Inhalt von RXD [...]
wird das sicher nicht gemacht
mfg mf
Erstmals vielen Dank für deine schnelle Antwort.
> Oder willst du eigentlich was ganz anderes erreichen?
Ich will eigentlich nur die Daten die ich von PIND0 (RXD Terminal von
UART am ATMEGA16) bekomme in eine Variable (in diesem Fall x) speichern
und zwar MSB first. Die BitWrite Funktion soll eben diese Daten dann in
richtiger Reihenfolge (wie schon gesagt MSB first) in die Variable x
speichern.
Außerdem weiß ich nicht ganz genau wo ich das Interrupt Flag löschen
soll. Ich habe dieses Interrupt schon öfters verwendet jedoch in ganz
anderer Ausführung und zwar in dem ich einfach UDR in einer Variable
speichere.
Lg kh
Kenan schrieb:> void clk()> {> PORTB |=(1<<PD0);> PORTB &=~(1<<PD1);> }
Auch das hier sieht seltsam aus. Ein Clock Puls wird sicher nicht
dadurch erzeugt, das PD0 auf 1 gesetzt wird und PD1 auf 0.
Noch ein Tipp: Du kannst in eine uint32_t Variable recht einfach Daten
eines Pins reinshiften. Wir nehmen mal an, das PD0 der Datenausgang des
ADC ist.
Matthias S. schrieb:> Kenan schrieb:>> void clk()>> {>> PORTB |=(1<<PD0);>> PORTB &=~(1<<PD1);>> }>> Auch das hier sieht seltsam aus. Ein Clock Puls wird sicher nicht> dadurch erzeugt, das PD0 auf 1 gesetzt wird und PD1 auf 0.
Ok danke für das Feedback, habe versucht hierbei einen Arduino Code
nachzubauen. Wie kann ich denn einen Puls Clock erzeugen? Muss ich einen
Timer verwenden?
> Noch ein Tipp: Du kannst in eine uint32_t Variable recht einfach Daten> eines Pins reinshiften. Wir nehmen mal an, das PD0 der Datenausgang des> ADC ist.uint32_t ReadMy24Bits() {> uint8_t n;> uint32_t result = 0;> for (n=0; n<24; n++) {> clk();> if (PIND & PD0) result |= 1;> result <<= 1;> }> return result;
Aha ok alles klar, danke für den Tipp.
Eigentlich sollte es eine SPI-Schnittstelle eher tun als der UART.
Da kann man glaub ich erstmal das AVR-GCC Tutorial in den Artikeln
empfehlen...
Der Code sieht wahllos zusammenkopiert aus und fast keine Codezeile
scheint das, was gewollt ist, zu tun. Zu sehen an den Kommentaren, die
fast das Gegenteil der Auswirkungen des umgebenden Codes beschreiben.
Nun, so lernt man dieses Zeug. Scheitern und lernen.
mfg mf
>> for (n=0; n<24; n++) {>> clk();>> if (PIND & PD0) result |= 1;>> result <<= 1;>> }>> return result;
Welche Funktion verwendest du hier für clk(); ?
lg kh
Kenan schrieb:> Welche Funktion verwendest du hier für clk(); ?> lg kh
Ich setzt hier eine funktionierende Routine für das Erzeugen eines
Clockpulses voraus. Da wir nach wie vor nichts über die Verdrahtung von
ADC und AVR wissen, gehe ich da nicht näher ins Detail.
Aber wenn z.B. der ADC auf eine steigende Flanke des Clockpulses ein
neues Bit zur Verfügung stellt und der Clock Eingang auf PD1 liegt, kann
das so aussehen:
1
voidclk(void){
2
_delay_us(10);// nur als Beispiel , Datenblatt des ADC entscheidet
3
PORTD&=~(1<<PD1);// Clock auf 0
4
_delay_us(10);// low für 10µs
5
PORTD|=(1<<PD1);// Clock auf 1, neues Bit kann eingelesen werden