Pergunta

Eu tenho uma tela de HD44780 LCD, e eu tenho usado a Biblioteca LiquidCrystal fornecido com o pacote de desenvolvimento Arduino. No entanto, não é confiável. Notei alguns problemas com ele, e em vez de ser interrupção conduzido, ele só dorme enquanto o desenvolvedor acha que o chip deve tomar para executar a operação.

A partir das folhas de especificações, a bandeira OCUPADO será definido enquanto está em execução, o que significa que é possível ser conduzido de interrupção.

Alguém sabe de uma biblioteca que realmente faz isso, e faz isso exigir que todos os 8 bits para ser conectado ou eu posso mantê-lo em 4 pinos?

Foi útil?

Solução

Eu não acho que você precisa de uma interrupção para isso. Olhando para LiquidCrystal.cpp na distribuição Arduino, você só precisa mudar o LiquidCrystal::write4bits, LiquidCrystal::write8bits e código LiquidCrystal::pulseEnable. Os dois primeiros métodos deve começar por monitorar a linha ocupada (BD7) antes de gravar dados, e o último seria modificado para remover a pausa 100us.

Penso que a razão isso não foi feito no código padrão é que muitos usuários desses LCDs apenas amarrar R / W à terra para o visor está sempre em modo de gravação, o que torna impossível para ler o sinal de ocupado. No entanto, esta é passada para a biblioteca, definindo _rw_pin para -1, então o código de impulso e de escrita pode condicionalmente usar o r / w pino como um modo de detecção de ocupado como uma optimização da velocidade.

Outras dicas

É possível utilizar 8 bits em três pinos; você só precisa de um registrador de deslocamento. Eu estou usando um HEF4094BP de mouser.com (transporte vai custar mais do que o chip real)

modificações

o esquema de ligações e de código para o registo de deslocamento está aqui: http: // www. arduino.cc/playground/Code/LCD3wires

Algum tempo atrás eu modificado o lib LiquidCrystal para apoiar a bandeira ocupado. Por favor, note que a operação conduzida verdadeira interrupção é não possível - para cada ler o que você precisa para alternar a linha Enable duas vezes. Portanto, você terá que consultar a bandeira ocupado.

Então eu fiz alguns benchmarks um encontrado, que polling a bandeira ocupado é mais lento do que apenas esperando para a maioria dos comandos. (A exceção são os comandos e 'clear' 'casa'). A razão era que alternar entre o modo de leitura e modo de escrita requer passos Adicionais como 8 chamadas adicionais para digitaWrite e 8 chamadas adicionais para pinMode. Mesmo com 16MHz Arduinos esta mais lento do que 100 us apenas esperando.

Depois que eu escrevi uma biblioteca que manipula os registros pinos diretamente e no modo em massa - todos os 8 pinos com acesso de um registo. Depois que eu estava no estádio para obter algum benefício por polling.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top