Hallo zusammen, ich bin gerade dabei einen ATmega 32 mit dem AVRStudio zu programmieren. Bisher habe ich dies immer mit Bascom AVR gemacht. Nun habe ich geplant auf C umzusteigen. Die Grundkenntnisse für die C-Programmierung sind auch vorhanden. Zu meinem Problem: Bei Bascom AVR gibt es einen Befehl SHIFTOUT der folgendes macht: (Auszug aus der Hilfe) Shifts a bit stream out of a variable into a port pin . Syntax SHIFTOUT pin , pclock , var , option [, bits , delay ] Remarks Pin The port pin which serves as a data output. Pclock The port pin which generates the clock. Var The variable that is shifted out. Option Option can be : 0 – MSB shifted out first when clock goes low 1 – MSB shifted out first when clock goes high 2 – LSB shifted out first when clock goes low 3 – LSB shifted out first when clock goes high Bits Optional number of bits to shift out. Delay Optional delay in uS. When you specify the delay, the number of bits must also be specified. When the default must be used you can also use NULL for the number of bits. If you do not specify the number of bits to shift, the number of shifts will depend on the type of the variable. When you use a byte, 8 shifts will occur and for an integer, 16 shifts will occur. For a Long and Single 32 shifts will occur. The SHIFTIN routine can be used to interface with all kind of chips. The PIN is normally connected with the input of a chip that will receive information. The PCLOCK pin is used to clock the bits out of the chip. The VARIABLE is a normal BASIC variable. And may be of any type except for BIT. The data that is stored in the variable is sent with PIN. The OPTIONS is a constant that specifies the direction of the bits. The chip that reads the data may want the LS bit first or the MS bit first. It also controls on which edge of the clock signal the data is sent to PIN. The number of bits may be specified. You may omit this info. In that case the number of bits of the element data type will be used. The DELAY normally consists of 2 NOP instructions. When the clock is too fast you can specify a delay time(in uS). Ich bin daher auf der Suche nach einem Befehl in C, der das gleiche macht wie dieser SHIFTOUT Befehl von Bascom. Kann mir dabei jemand weiterhelfen, bzw. existiert für so was schon irgendwo eine Headerdatei? Danke für Eure Hilfe!!
Uii, als fertige Lösung wäre mir das nicht bekannt. Musst du wahrscheinlich sleber schreiben. Aber vielleicht ist es vielversprechender, das Problem anders anzugehen. Wahrscheinlich kommt dabei dann eine wesentlich bessere C Lösung bei raus. Der Auszug aus der Bascom Hilfe riecht für mich nach ganz viel polling und massig Warteschleifen. Wenn du mal dein Problem schilderst, kommen wir ja vielleicht zusammen auf einen (eleganteren) Lösungsansatz?
Also das Problem ist dass ich über genau eine Leitung Bitkombinationen seriell rauschicken muss, um ein Poti einzustellen. Deshalb benötige ich auch diese delay Einstellung! Und genau dafür war der Befehl SHIFTOUT von Bascom einfach genial und ich dachte, dass es dafür eben schon eine Headerdatei oder so etwas in C gibt.
Tach. Schau mal in der Ansteuerung für LCD Modulen an einem Schiftregister nach. Da gibt es viele verschiedene Lösungen.
Steffen Zimmer wrote: > Also das Problem ist dass ich über genau eine Leitung Bitkombinationen > seriell rauschicken muss, um ein Poti einzustellen. Deshalb benötige ich > auch diese delay Einstellung! Und genau dafür war der Befehl SHIFTOUT > von Bascom einfach genial und ich dachte, dass es dafür eben schon eine > Headerdatei oder so etwas in C gibt. Wenn Du Daten über nur eine Leitung senden willst, mußt Du die UART nehmen und die entsprechende Baudrate einstellen. Das SHIFTOUT (SPI) gibt immer 2 Signale aus (Takt, Daten) und das Delay ist eher als Minimalzeit gedacht, falls die Leitung länger ist oder der Slave langsamer. Nen SPI-Beispielcode findest Du hier: Beitrag "Re: Schieberegister-LCD vereinfachen" Peter
Peter Dannegger wrote: > Wenn Du Daten über nur eine Leitung senden willst, mußt Du die UART > nehmen und die entsprechende Baudrate einstellen. Also das mit dem UART hab ich mir auch schon angeschaut. Wird aber in meinem Fall leider nicht funktionieren. > Das SHIFTOUT (SPI) gibt immer 2 Signale aus (Takt, Daten) und das Delay > ist eher als Minimalzeit gedacht, falls die Leitung länger ist oder der > Slave langsamer. Ja soweit ist mir das auch klar und das sollte auch genauso sein! > Nen SPI-Beispielcode findest Du hier: Also wenn ich das dann so richtig verstanden habe müsste diese Funktion die Lösung meines Problems sein?! void send_char (uint8_t dsp_char_out) { uint8_t n; for (n=0; n<8; n++) { // Sende 8 BIT if (dsp_char_out & (0x80 >> n)) // Daten an Display ausgeben, MSB first { PORTB |= (1 << DATA); } else { PORTB &= ~(1 << DATA); } PORTB &= ~(1 << CLOCK); // Ausgabe des Schiebetakt, CLOCK = 0 PORTB |= (1 << CLOCK); // CLOCK = 1 } wait (delay_irgendwas); } oder liege ich da falsch? Wenn nicht bräuchte ich noch ne kurze erklären zu diesem Code.Und zwar steht da immer PORTB. Kann ich jetzt z.B. über den PORTB1 meine Daten senden und über PORTB2 mein Clock? Also ich muss dass dann in diesem Code natürlich noch ergänzen. Aber das würde dann so funktioneren?
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.